最も近い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:私のpython 2.7
2を使用しています
1))私は最終的機能でそれを使用しています。この特別な場合に予期しない結果をもたらすものです。私は入力データの品質とそのデータ精度を制御することはできません。それは、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にはとても新しいですが、浮動小数点数には問題があると思います。 10進数をインポートすると、それは私が推測するより正確になります。ちょうど 'import decimal' – ihpar
ヒント:' 127.6500000000000056 == 127.65'とは何ですか?答えはあなたを驚かせるか? –