次の 2 つの double の積を計算しようとしています。
double x = 196.0d;
double y = 0.5144d;
double z = x * y;
これに対する答えはあるはずですz = 100.8224;
が、Javaはそれを次のように計算しますz = 100.82239999999999;
これは何が原因ですか?
次の 2 つの double の積を計算しようとしています。
double x = 196.0d;
double y = 0.5144d;
double z = x * y;
これに対する答えはあるはずですz = 100.8224;
が、Javaはそれを次のように計算しますz = 100.82239999999999;
これは何が原因ですか?
0.5144 に最も近い倍精度浮動小数点数は 4633303296638766 / 2 ^ 53 で、実際には 0.5143999999999996838084825867554 です。ただし、Java はこれを 0.5144 と表示します。これは、特定の倍精度浮動小数点数に十分近い数値が存在する場合に、小数点以下の桁数が少ない数値を選択するヒューリスティックがあるためです。
ただし、同じ数に 196 を掛けると、誤差が大きくなり、100.82239999999999380264625870041 になります。100.8224 に近い別の倍精度浮動小数点数があるため、これは 100.8224 として表示されるほど 100.8224 に近くありません。
DecimalFormat decimalFormat = new DecimalFormat("##,###,###.####");
decimalFormat.format(z);
System.out.println(decimalFormat.format(z));
You can do it like this:
double x = 196.0d;
double y = 0.5144d;
BigDecimal bigdec = new BigDecimal(x).multiply(new BigDecimal(y));
bigdec = bigdec.setScale(4, BigDecimal.ROUND_HALF_UP);
System.out.println(bigdec.doubleValue());