1

次の 2 つの double の積を計算しようとしています。

double x = 196.0d;
double y = 0.5144d;

double z = x * y;

これに対する答えはあるはずですz = 100.8224;が、Javaはそれを次のように計算しますz = 100.82239999999999;

これは何が原因ですか?

4

3 に答える 3

5

0.5144 に最も近い倍精度浮動小数点数は 4633303296638766 / 2 ^ 53 で、実際には 0.5143999999999996838084825867554 です。ただし、Java はこれを 0.5144 と表示します。これは、特定の倍精度浮動小数点数に十分近い数値が存在する場合に、小数点以下の桁数が少ない数値を選択するヒューリスティックがあるためです。

ただし、同じ数に 196 を掛けると、誤差が大きくなり、100.82239999999999380264625870041 になります。100.8224 に近い別の倍精度浮動小数点数があるため、これは 100.8224 として表示されるほど 100.8224 に近くありません。

于 2013-10-21T10:30:51.717 に答える
2

DecimalFormat を試す

        DecimalFormat decimalFormat = new DecimalFormat("##,###,###.####");
        decimalFormat.format(z);
        System.out.println(decimalFormat.format(z));
于 2013-10-21T10:25:54.943 に答える
0

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());
于 2013-10-21T10:30:36.510 に答える