誰かがなぜ私が理解したいと思う166.9(私はラウンド()関数があることを知っている)を私に説明することができますか? :)Python3 strange float rounding
>>> 165.0 + 1.45 + 0.45
166.89999999999998
誰かがなぜ私が理解したいと思う166.9(私はラウンド()関数があることを知っている)を私に説明することができますか? :)Python3 strange float rounding
>>> 165.0 + 1.45 + 0.45
166.89999999999998
これは、数値がバイナリ形式で表されているためです。これはPythonでしか問題ではありませんが、一般的にコンピュータです。
私の2€calcはこの計算を扱うことができ、このsimpecプログラムは正しい答えを見つけます:#include
はい、当然です。このトピックについてのリンクを見てください。簡単に言うと、計算機は内部的にはバイナリ形式の数字を持っていて、内部で表現された1.45のような数字を持っています。 1.4499999999999999999として。しかし彼は内部番号を表示する場所があまり多くなく、それを丸めてディスプレイ1.45に表示します。しかし、コンピュータはメモリ内にはるかに多くのスペースを持っています。彼はあなたのためにそれを四捨五入していないので、バイナリ形式では精度が高く、必要でない場合は丸めません。逆説的に、より安価なデバイスはそれを丸めて、それはより正確に見えますが、内部的にはそうではありません。 –
あなたの例は素晴らしいですが、あなたが知っておかなければならないのは、どの形式 "%f \ n" 'が意味するものです。例えば、この形式の ''%.30f \ n "'を試してみてください。小数点は30小数点になります。結果は166.899999999999977262632455676794です。全体プログラム: '#include
浮動小数点数は、Pythonで64ビットで格納されます。 1ビットは符号、52ビットは指数、11は指数です。これらの3つのコンポーネントから小数値を得るには、コンピュータはsign * mantissa * 2 ^指数を行います。
すべての数字をこの形式で完全に保存することはできません。番号を格納するためのわずか52ビット。たとえば、11.3は完全にこの形式で格納することはできません。これを使って数値の正確な値を見ることができます。
from decimal import Decimal
print(Decimal(11.3))
165.0 + 1.45 + 0.45を追加したとき。
>>> print(Decimal(165))
165
>>> print(Decimal(1.45))
1.4499999999999999555910790149937383830547332763671875
>>> print(Decimal(0.45))
0.450000000000000011102230246251565404236316680908203125
実際には正確な値を追加していませんでした。
浮動小数点システムの詳細については、Wikipediaを参照してください。
私は[浮動小数点演算が壊れている](http://stackoverflow.com/q/588004/5647260) – Li357
@JonathonReinhart、したがって、本当に奇妙だコメント – Li357
@JonathonReinhartにupvotesが、私のフラグオプションがグレー表示されているので、だから私は間違いなく重複としてマークした – Li357