2014-07-19 14 views
22

Próbuję zaokrąglić liczby zmiennoprzecinkowe do najbliższego 0,5zaokrąglij spację do najbliższego 0.5 w pytonie

Na przykład.

1.3 -> 1.5 
2.6 -> 2.5 
3.0 -> 3.0 
4.1 -> 4.0 

To co robię

def round_of_rating(number): 
     return round((number * 2)/2) 

This rund numery do najbliższej liczby całkowitej. Jaki byłby właściwy sposób, aby to zrobić?

+10

Twoje rozwiązanie jest w porządku, ale swój nawiasy są źle umieszczone. Chcesz 'round (number * 2.0)/2.0'. –

+0

@MarkDickinson Dzięki, to działa. –

+0

@julienc: To nie jest duplikat, ponieważ reguły zaokrąglania są zupełnie inne. –

Odpowiedz

38

Spróbuj zmienić pozycję nawiasie tak że zaokrąglenie dzieje przed podziałem przez 2

def round_of_rating(number): 
    """Round a number to the closest half integer. 
    >>> round_of_rating(1.3) 
    1.5 
    >>> round_of_rating(2.6) 
    2.5 
    >>> round_of_rating(3.0) 
    3.0 
    >>> round_of_rating(4.1) 
    4.0""" 

    return round(number * 2)/2 

Edit: dodał doctest stanie docstring:

>>> import doctest 
>>> doctest.testmod() 
TestResults(failed=0, attempted=4) 
+3

Muszę powiedzieć, że '/ 2' denerwuje mnie przypadkowo używając podziału podłogi, ale okazuje się, że jest w porządku (z różnych powodów) w Pythonie 2 i Pythonie 3: w Pythonie 2,' round' zwraca zmiennoprzecinkowe nawet przy wprowadzaniu liczb całkowitych, aw Pythonie 3 '/' robi prawdziwe dzielenie zamiast podziału piętra! Niemniej jednak, prawdopodobnie użyłbym '2.0', aby ochronić czytelników kodu przed koniecznością przejścia przez tę samą kontrolę mentalną. –

+2

BTW, liczba jest ogólna. Możesz znaleźć najbliższą trzecią, czwartą, piątą ... itd. Po prostu zmieniając 2 na inną liczbę. Ale uważaj na pozyskiwanie liczb nieracjonalnych. – CMCDragonkai