これはJavaの不具合ですか?私はこの表現を解決するために行くJavaのグリッチ?数字を減算する?
:3.1から7.1
が、私は答えを得る:-3.9999999999999996
ここで何が起こっていますか?
これはJavaの不具合ですか?私はこの表現を解決するために行くJavaのグリッチ?数字を減算する?
:3.1から7.1
が、私は答えを得る:-3.9999999999999996
ここで何が起こっていますか?
大きな説明がここにあります。 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
あなたが最初に期待するかもしれないものはおそらくされていません。
詳細については、提供されているリファレンスを参照してください。
丸め誤差(それは少なくとも、コンパイラによって折らないです)3 * 0.1 != 0.3
自動タイプのプロモーションが起こっている、それは結果であることを
同じように数値を四捨五入する方法グーグル。
ここにいくつかのリソースがあります。次のステップは次のようになり
http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html
所定の精度/要件にそれをフォーマットするフォーマッタを使用することを学ぶことです。
正確に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
浮動小数点演算は何が起こっているのですか? –
[this](http://stackoverflow.com/questions/2798830/double-precision-values)などの他のものを参照してください。 (ちょっと、WECSSKAFPN記事はどこに行きますか?) –
これは最も一般的なプログラミングの問題です。 .... –