1

重複の可能性:
二重計算により奇妙な結果が生成される

私は多くの二重演算を扱うJavaでプログラムを書いています。最終的に、0.6666666666666666と-0.666666666666667を追加する必要があります。しかし、私が得た答えは-3.3306690738754696E-16です。

言い換えると、

double d1 = 0.6666666666666666;
double d2 = -0.666666666666667;
System.out.println(d1 + d2);

「-3.3306690738754696E-16」を出力します。なぜこうなった?

前もって感謝します。

4

2 に答える 2

6

doublesは完全に正確ではなく、すべての小数をaとして完全に表すことができるわけではありませんdoubleこれを参照)。すべての実用的な目的のために、-3.3306690738754696E-160*です。ただし、より高い精度が必要な場合は、を使用してBigDecimalください。この代替手段は、プリミティブを使用する場合ほど効率的ではないことに注意してくださいdouble。このレベルの精度が必要かどうかを判断し、それに応じて選択するのはあなた次第です。

*:明らかに、その数は正確にゼロではありませんが、実際の計算や計算の大部分では、この小さな値無視できません。メートル単位では、この値は陽子と中性子の直径よりも小さく、つまり非常に小さい値です。それが私が「すべての実用的な目的のために」という意味です。

于 2013-01-06T23:42:37.137 に答える
1

double値はすべての値を正確に表すことはできません。これはそのような例です。代わりに使用できますBigDecimal

BigDecimal bd1 = new BigDecimal("0.6666666666666666");
BigDecimal bd2 = new BigDecimal("-0.666666666666667");
System.out.println(bd1.add(bd2));

出力:

-4E-16
于 2013-01-06T23:43:11.947 に答える