2013-10-25 12 views
6

Co to jest rozwiązanie Pythoniczne dla następujących?Wydajny sposób na zaokrąglanie do arbitralnej precyzji w Pythonie

Czytam czujnik temperatury, który ma rozdzielczość .5. Muszę do niego napisać (ma programowalne wyjście termostatu), również z rozdzielczością .5.

Więc napisałem tę funkcję (Python 2.7), aby zaokrąglić pływaka jako wejście do do najbliższego .5:

def point5res(number): 
    decimals = number - int(number) 
    roundnum = round(number, 0) 
    return roundnum + .5 if .25 <= decimals < .75 else roundnum 

print point5res (6.123) 

print point5res(6.25) 

print point5res(6.8) 

które działa prawidłowo, wyjścia 6.0, 6.5 i 7.0, odpowiednio. Właśnie tego chcę.

Jestem stosunkowo nowy w Pythonie. Linia

return roundnum + .5 if .25 <= decimals < .75 else roundnum 

ma mnie śliniąc się z podziwem dla jej implementorów. Ale czy to jest Pythonic?

Edytuj: od momentu zamieszczenia informacji dowiedziałem się nieco więcej o what is and isn't 'Pythonic'. Mój kod nie jest. Cmd's anwwer, poniżej, jest. Dziękuję Ci!

+0

Wypróbuj - 5.4. –

+0

lub wartości ujemne ogólnie Przypuszczam, że –

+1

Spróbuj 6.51. Wynik to 7,5. Ale masz rację, przykuty porównań to wspaniała cecha. Ternarna składnia wyrażeń, gdy ją "zdobędziesz", jest również bardzo przyjemna. –

Odpowiedz

6

Są one uważane za python, jeśli zachowujesz proste wyrażenia, w przeciwnym razie trudno będzie je odczytać.

bym zaokrąglić z dokładnością do 0,5 tak:

round(number*2)/2.0 

lub bardziej ogólnie:

def roundres(num, res): 
    return round(num/res) * res 
+0

W porównaniu z podanymi przykładami OP, to nie zwraca tych samych wartości. To jest zwracanie liczb całkowitych (spróbuj o 6.25). – CDspace

+0

@CDspace, z których pierwotny miał problemy, dlatego wysłałem alternatywę. Również kompilacja '==' na float nie będzie się zachowywać zgodnie z oczekiwaniami. – cmd

+0

Należy pamiętać, że 'round()' zmieniło swoje zachowanie między Python 2 i Python 3. 'round (0.5)' to '1' w Pythonie 2 i' 0' w Pythonie 3. To rozwiązanie działa tylko w Pythonie 2. Z tego właśnie korzysta OP, więc +1 –

0
return 0.5 * divmod (number, 0.5) [0] if number >= 0 else -0.5 divmod (number, -0.5) [0] 

To wygląda ładniej choć:

def roundToHalf (number): 
    ''' Round to nearest half ''' 
    half = 0.5 if number >= 0 else -0.5 
    return half * divmod (number, half) [0] 
Powiązane problemy