2011-12-25 13 views
2

可能性の重複:次のコード与え
Floating point arithmetic not producing exact results in Java
Floating point inaccuracy examplesダブルマイナスのint与える予期しない結果

Javaでは

、:最初の計算の後

double amount = scan.nextDouble(); 

    tenBills = (int)amount/(int)10; 
    amount = amount - (tenBills * 10); 

    fiveBills = (int)amount/(int)5; 
    amount = amount - (fiveBills * 5); 

、与えられたsa y 16の金額は6.66になります。しかし、2回目の計算後は1.6600000000000001となります。私はなぜdoubleからintを減算するとそのような結果が生じるのか分からない。

+2

これは[浮動小数点演算](http://en.wikipedia.org/wiki/Floating-point_arithmetic)と呼ばれ、この質問は**常にそうです**。これを読んでください:http://csharpindepth.com/Articles/General/FloatingPoint.aspx –

+0

あなたがあなたの直接の質問への答えを得たら、あなたは[BigDecimal](http://docs.oracle.com/ javase/7/docs/api/java/math/BigDecimal.html)クラスを使用すると、コードの精度が向上します。 – joschi

+0

..または結果を丸める。 –

答えて

1

doubleからintを減算しても、doubleの整数部分だけは変更されません。また、スケールを変更することもできます。あなたの特別な場合、減算(6)の前の整数部分は、減算(1)の後の整数部分よりも多くのビットを表現する必要があります。これにより、数の表現全体がより多くの小数ビットを可能にする。結果は、予期せぬ結果になる可能性があります。 (Punが意図している)

+0

あなたのおしゃべりは何年も後に笑われました。 –

2

ハードコアの説明が必要な場合は、古典What Every Computer Scientist Should Know About Floating-Point Arithmeticをお読みください。あなたが見ているような浮動小数点演算で、必然的に小さな丸め誤差がある理由を説明します。

要約だけが必要な場合:コンピュータはすべてをバイナリ形式で表します。浮動小数点演算を行っている間のバイナリ表現は、状況によっては微妙な不正確さをもたらします。

関連する問題