Java:双打不正常显示

时间:2013-10-21 10:23:20

标签: java multiplication

我正在尝试计算以下两个双打的乘积:

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

double z = x * y;

答案应为z = 100.8224;,但java会将其计算为z = 100.82239999999999;

造成这种情况的原因是什么?

3 个答案:

答案 0 :(得分:5)

最接近的双精度浮点数为0.5144是4633303296638766/2 ^ 53,实际上是0.51439999999999996838084825867554。但是,Java将其显示为0.5144,因为如果有一个与给定的双精度浮点数足够接近的数字,它可以选择具有较少小数位数的启发式。

当您将相同的数字乘以196时,错误会复合,您将以100.82239999999999380264625870041结束。这不足以使100.8224显示为100.8224,因为还有另一个双精度浮点数接近100.8224。

答案 1 :(得分:2)

尝试DecimalFormat

        DecimalFormat decimalFormat = new DecimalFormat("##,###,###.####");
        decimalFormat.format(z);
        System.out.println(decimalFormat.format(z));

答案 2 :(得分:0)

你可以这样做:

        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());