2013-10-25 56 views
6

什麼是Python的以下解決方案?在Python中四捨五入到任意精度的有效方法

我在閱讀具有.5分辨率的溫度傳感器。我需要寫入它(它有一個可編程的恆溫器輸出),也有.5分辨率。

所以我寫了這個功能(Python 2.7版)的持股量輸入四捨五入到到最近的1.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) 

的正常工作,輸出6.0,分別爲6.5和7.0。這正是我想要的。

我對Python比較陌生。該行

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

有我流口水讚歎它的執行者。但是Pythonic?

編輯:自發布以來,我多瞭解了一些關於what is and isn't 'Pythonic'。我的代碼不是。下面是Cmd的簡介。謝謝!

+0

嘗試它 - 5.4。 –

+0

或一般負數值我想 –

+1

嘗試6.51。結果是7.5。但是你是對的,鏈式比較是一個很棒的功能。而三元表達式的語法,一旦你「得到」它,也是非常好的。 –

回答

6

如果你保持表達式簡單,否則它們會被認爲是pythonic,否則會變得難以閱讀。

我會四捨五入到最接近的0.5這樣的:

round(number*2)/2.0 

或更一般地:

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

與OP給出的示例相比,這不會返回相同的值。這是返回整個數字(嘗試6.25) – CDspace

+0

@CDspace原來的有問題,這就是爲什麼我發佈替代。同樣在float上比較'=='也不會像預期的那樣工作。 – cmd

+0

請注意'round()'已經改變了它在Python 2和Python 3之間的行爲。'round(0.5)'在Python 2中是'1',在Python 3中是'0'。所以這個解決方案只適用於Python 2。 OP使用的是什麼,所以+1 –

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

這看起來更好,但:

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