16

Javaでのこの単純な「二重」計算の何が問題になっていますか?

一部の 10 進数は float / double バイナリ形式で適切に表現できないことはわかっていますが、変数 d3 を使用すると、java は 2.64 を問題なく格納および表示できます。

double d1 = 4.64;
double d2 = 2.0;
double d3 = 2.64;
double d4 = d1 - d2;

System.out.println("d1      : " + d1);
System.out.println("d2      : " + d2);
System.out.println("d3      : " + d3);
System.out.println("d4      : " + d4);
System.out.println("d1 - d2 : " + (d1 - d2));

答え、

d1      : 4.64
d2      : 2.0
d3      : 2.64
d4      : 2.6399999999999997
d1 - d2 : 2.6399999999999997
4

5 に答える 5

4

d1 - d2 は、バイナリ浮動小数点演算の正確な結果を返し、それは 2.6399999999999997 であるため、出力されます。丸めたい場合は、印刷中に行うことができます

System.out.printf("d1 - d2 : %.2f",  d4);

またはCommons-Mathを使用

d4 = Precision.round(d4, 2);
于 2013-05-23T07:04:03.247 に答える
3

主な理由は、 double が倍精度の 64 ビット IEEE 754 浮動小数点であるためです。正確な小数値を保持するためのものではありません。そのため、正確な計算に double を使用することはお勧めしません。代わりに、次のようにBigDecimalの String コンストラクターを使用します。

new BigDecimal("2.64")
于 2013-05-23T07:00:04.647 に答える
0

それは何も悪いことではありません。しかし、 BigDecimal を使用してみてください

http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html

注: double と float は、IEEE 標準 754 に従って内部的に 2 進分数として表現されるため、10 進数を正確に表現することはできません。

于 2013-05-23T06:53:01.297 に答える