2016-08-03 12 views
-3

誰かがなぜ私が理解したいと思う166.9(私はラウンド()関数があることを知っている)を私に説明することができますか? :)Python3 strange float rounding

>>> 165.0 + 1.45 + 0.45 
166.89999999999998 
+6

私は[浮動小数点演算が壊れている](http://stackoverflow.com/q/588004/5647260) – Li357

+0

@JonathonReinhart、したがって、本当に奇妙だコメント – Li357

+0

@JonathonReinhartにupvotesが、私のフラグオプションがグレー表示されているので、だから私は間違いなく重複としてマークした – Li357

答えて

0

これは、数値がバイナリ形式で表されているためです。これはPythonでしか問題ではありませんが、一般的にコンピュータです。

+0

私の2€calcはこの計算を扱うことができ、このsimpecプログラムは正しい答えを見つけます:#include int main() { printf( "%f \ n"、165.0 + 1.45 + 0.45); return 0; } – hanoo

+0

はい、当然です。このトピックについてのリンクを見てください。簡単に言うと、計算機は内部的にはバイナリ形式の数字を持っていて、内部で表現された1.45のような数字を持っています。 1.4499999999999999999として。しかし彼は内部番号を表示する場所があまり多くなく、それを丸めてディスプレイ1.45に表示します。しかし、コンピュータはメモリ内にはるかに多くのスペースを持っています。彼はあなたのためにそれを四捨五入していないので、バイナリ形式では精度が高く、必要でない場合は丸めません。逆説的に、より安価なデバイスはそれを丸めて、それはより正確に見えますが、内部的にはそうではありません。 –

+0

あなたの例は素晴らしいですが、あなたが知っておかなければならないのは、どの形式 "%f \ n" 'が意味するものです。例えば、この形式の ''%.30f \ n "'を試してみてください。小数点は30小数点になります。結果は166.899999999999977262632455676794です。全体プログラム: '#include int main(){printf("%。30f \ n "、165.0 + 1.45 + 0.45); 0を返します。 } ' –

0

浮動小数点数は、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を参照してください。