舍入到最接近的0.05,我只是除以0.05,然後乘以0.05。正如其他類似問題所述。奇怪的情況下舍入到最接近的0.05 - 特例
In [119]: (127.651//0.05)*0.05
Out[119]: 127.65
In [120]: (127.6501//0.05)*0.05
Out[120]: 127.65
In [121]: (127.65000001//0.05)*0.05
Out[121]: 127.65
In [122]: (127.65000000001//0.05)*0.05
Out[122]: 127.65
In [123]: (127.6500000000001//0.05)*0.05
Out[123]: 127.65
直到這裏它按預期的那樣做。 然而,對於這種特殊情況:
In [124]: (127.650000000000000001//0.05)*0.05
Out[124]: 127.60000000000001
我會在這裏預計127.65。
在分割之前嘗試四捨五入,但又一次奇怪。 不僅我得到意想不到的結果(期望127.65),而且它給出的結果超出了2位小數,這將導致我的進一步處理函數失敗。
In [125]: (round(127.650000000000000001,5)//0.05)*0.05
Out[125]: 127.60000000000001
如果我剛執行的內輪,O/P是127.65 ...
In [126]: round(127.650000000000000001,5)
Out[126]: 127.65
但在添加除運算邏輯..結果變成意想不到的。
In [125]: (round(127.650000000000000001,5)//0.05)*0.05
Out[125]: 127.60000000000001
是否應該有任何數據類型的問題?或Python的內部精度限制?
我如何以優雅的方式克服它?
PS:
1)我使用Python 2.7
2)我最終使用它的功能。這給特殊情況帶來了意想不到的結果。我無法控制輸入數據質量及其數據精度,因爲它是通過讀取csv文件到數據幀。
def RP(price):# Round down to the nearest price quotable ...i.e. multiple of 0.05
return(round(price//0.05*0.05,2))
更經典[浮點數學是否被破壞?](https://stackoverflow.com/q/588004/3001761)。如果您想要精確表示,請考慮使用['Decimal'](https://docs.python.org/3/library/decimal.html)。 – jonrsharpe
我對py很陌生,但我猜浮點數會有問題。導入小數將使我精確得多。只要'輸入小數' – ihpar
提示:127.6500000000000056 == 127.65'給你什麼?答案會讓你感到驚訝嗎? –