5

これはJavaの不具合ですか?

この式を解きに行きます: 3.1 - 7.1

私は答えを得る: -3.9999999999999996

ここで何が起こっているのですか?

4

5 に答える 5

10

ここで素晴らしい説明を見つけることができます。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  

これはおそらく、最初は期待できないものです。

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

于 2011-11-11T20:32:39.907 に答える
2

他の何人かが述べた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
于 2011-11-11T22:30:35.087 に答える
1

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

于 2011-11-11T20:23:31.367 に答える
1

浮動小数点の丸め誤差

同じように3 * 0.1 != 0.3(少なくともコンパイラによって折りたたまれていない場合)

于 2011-11-11T20:23:46.370 に答える
1

自動型昇格が行われており、それが結果です。

ここに学ぶためのリソースがあります。

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

次のステップは、フォーマッターを使用して、指定された精度/要件にフォーマットすることを学ぶことです。

于 2011-11-11T20:24:31.117 に答える