首先要注意這個問題(意外舍去)僅有時時發生數字直接低於(你的四捨五入的數字的左邊)有一個5
。
即
>>> round(1.0005,3)
1.0
>>> round(2.0005,3)
2.001
>>> round(3.0005,3)
3.001
>>> round(4.0005,3)
4.0
>>> round(1.005,2)
1.0
>>> round(5.005,2)
5.0
>>> round(6.005,2)
6.0
>>> round(7.005,2)
7.0
>>> round(3.005,2)
3.0
>>> round(8.005,2)
8.01
但有一個簡單的解決方案,我發現,似乎總是工作,並且不依賴於額外的庫import
。解決的辦法是增加一個其中X
是你正在嘗試使用上round
加1
數字符串的長度。
>>> round(0.075,2)
0.07
>>> round(0.075+10**(-2*6),2)
0.08
啊哈!因此,基於這一點,我們可以方便的包裝函數,它是獨立的,不需要額外的import
電話......
def roundTraditional(val,digits):
return round(val+10**(-len(str(val))-1))
基本上,這增加了保證比字符串的至少給定的數字小的值,你'正試圖使用round
。通過添加少量它保存的round
的在大多數情況下的行爲,而現在如果不如一個數字被四捨五入爲確保是5
它四捨五入,如果是4
它幾輪下來。
使用10**(-len(val)-1)
的方法是有意的,因爲它是您可以添加的最大的小數字來強制轉換,同時也確保即使缺少小數點.
,添加的值也不會更改舍入。我可以只使用10**(-len(val))
與condiditional if (val>1)
減去1
更多...但它更簡單,只是始終減去1
因爲這將不會改變太多小數此變通辦法可以妥善處理的適用範圍。如果你的值達到了類型的限制,這種方法將失敗,這將失敗,但對於幾乎整個範圍的有效小數值,它應該工作。
您還可以使用decimal庫來做到這一點,但我提出的包裝比較簡單,可以在某些情況下是首選。
編輯:感謝Blckknght的指出了5
邊緣的情況下對某些值here只發生。
爲什麼不使用python中的回合? –
@SeekAddo。我將如何四捨五入到最接近的0.05?我還需要控制舍入方向(即我需要向上舍入/向下舍入)。 – gurch101
def round_num(金額): print(round(金額,2)) round_num(23.045954)會給你23.05,讓我問一下,你想怎樣才能像@ gurch101 –