2011-11-11 10 views
5

これはJavaの不具合ですか?私はこの表現を解決するために行くJavaのグリッチ?数字を減算する?

:3.1から7.1

が、私は答えを得る:-3.9999999999999996

ここで何が起こっていますか?

+15

浮動小数点演算は何が起こっているのですか? –

+0

[this](http://stackoverflow.com/questions/2798830/double-precision-values)などの他のものを参照してください。 (ちょっと、WECSSKAFPN記事はどこに行きますか?) –

+2

これは最も一般的なプログラミングの問題です。 .... –

答えて

10

大きな説明がここにあります。 http://www.ibm.com/developerworks/java/library/j-jtp0114/

浮動小数点演算はまれです。 などの一部の数値は、2進数(2進数)として正確に表すことができます( 0.5は2-1に等しいので、0.1など)。その結果、浮動小数点演算によって丸め誤差が発生し、 の結果に近い値の が得られます。例えば、 2.600000000000001ではなく、2.6で結果以下の単純な計算:同様

double s=0; 

for (int i=0; i<26; i++) 
    s += 0.1; 
System.out.println(s); 

、0.1 * 26乗算は 自体に26回.1を加えることとは異なる結果が得られます。 浮動小数点型から整数型へのキャストの場合、 整数型にキャストすると、非整数部が廃棄されるため、 の計算でも整数値を持つ必要があります。たとえば、 次の文:

double d = 29.0 * 0.01; 
    System.out.println(d); 
    System.out.println((int) (d * 100)); 

は出力として生成します。

0.29 
    28 

あなたが最初に期待するかもしれないものはおそらくされていません。

詳細については、提供されているリファレンスを参照してください。

1

コンピュータは100%ですので、数学の世界では正しいですが、普通の人にはそうではありません。 Java cantは、同じ方法で実行されているが入力が異なるコードなので、特定の数値にエラーがあります。

P.S.浮動小数点で

+0

ありがとうございました。これはちょうど本当に奇妙です... – Confiqure

+0

'Javaにはエラーがありません' ??私はバグのないコンピュータシステムには一度も出会ったことがありません.... –

+0

いいえ、簡単な追加で、5 + 5は正しいと言います6 + 5は意味しません。 – Hego555

1

丸め誤差(それは少なくとも、コンパイラによって折らないです)3 * 0.1 != 0.3

1

自動タイプのプロモーションが起こっている、それは結果であることを

同じように数値を四捨五入する方法グーグル。

ここにいくつかのリソースがあります。次のステップは次のようになり

http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html

所定の精度/要件にそれをフォーマットするフォーマッタを使用することを学ぶことです。

2

正確に10進値を取得する場合は、doubleに数えられません。金融アプリケーションを導入するときその代わりにあなたがするべきことは、BigDecimalをよく見ることです。

BigDecimal a = new BigDecimal("3.1"); 
BigDecimal b = new BigDecimal("7.1"); 
BigDecimal result = a.subtract(b); 
System.out.println(result);  // Prints -4.0