これはJavaの不具合ですか?
この式を解きに行きます: 3.1 - 7.1
私は答えを得る: -3.9999999999999996
ここで何が起こっているのですか?
これはJavaの不具合ですか?
この式を解きに行きます: 3.1 - 7.1
私は答えを得る: -3.9999999999999996
ここで何が起こっているのですか?
ここで素晴らしい説明を見つけることができます。http://www.ibm.com/developerworks/java/library/j-jtp0114/
浮動小数点演算が正確であることはめったにありません。0.5 などの一部の数値は、2 進数 (基数 2) の 10 進数として正確に表すことができますが (0.5 は 2-1 に等しいため)、0.1 などの他の数値は表すことができません。その結果、浮動小数点演算で丸め誤差が発生し、予想される結果に近い (ただし等しくない) 結果が得られる場合があります。たとえば、以下の単純な計算では、2.6 ではなく 2.600000000000001 になります。
double s=0; for (int i=0; i<26; i++) s += 0.1; System.out.println(s);
同様に、.1*26 を掛けると、それ自体に .1 を 26 回足した場合とは異なる結果が得られます。浮動小数点から整数にキャストする場合、整数型にキャストすると非整数部分が破棄されるため、丸め誤差はさらに深刻になります。たとえば、次のステートメントは次のとおりです。
double d = 29.0 * 0.01; System.out.println(d); System.out.println((int) (d * 100));
出力として生成されます:
0.29 28
これはおそらく、最初は期待できないものです。
詳細については、提供されているリファレンスを参照してください。
他の何人かが述べた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
Computers are 100% so in the math world that is correct, to the average person it is not. Java cant have a error on a specific number as it is just code that runs the same way but has a different input!
P.S. Google how to round a number
浮動小数点の丸め誤差
同じように3 * 0.1 != 0.3
(少なくともコンパイラによって折りたたまれていない場合)
自動型昇格が行われており、それが結果です。
ここに学ぶためのリソースがあります。
http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html
次のステップは、フォーマッターを使用して、指定された精度/要件にフォーマットすることを学ぶことです。