舍入双精度到2位小数始终返回0.0

时间:2014-04-11 12:18:25

标签: java

我尝试将double值舍入到2位小数,但我总是得到0.0。我尝试了三种方法。

首先:

System.out.println(Math.round(reward*100.0)/100.0);

第二:

System.out.println(String.valueOf(round(reward, 2))); 
private double round(double value, int places)      
    if (places < 0) throw new IllegalArgumentException();

        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(places, RoundingMode.HALF_UP);

    return bd.doubleValue();
}

第三

DecimalFormat df = new DecimalFormat("###.##");
System.out.println(df.format(reward));

每次我只得到0.0。示例值:

  • 5.957818181818184E-16 0.0
  • 3.927272727272729E-18 0.0
  • 3.1250000000000005E-16 0.0
  • 1.6000000000000006E-19 0.0

我在这里缺少什么?

谢谢!

2 个答案:

答案 0 :(得分:4)

您在那里测试的四个值四舍五入为0.0!

5.957818181818184E-16等于5.95... * 10^(-16)等于0.000...0595...,在第一个非零数字前面有16个零。类似于您的其他价值观。您熟悉scientific notation吗?

答案 1 :(得分:2)

您引用的所有示例都是非常非常非常小的数字。如果将它们四舍五入到两个位置,则结果为零。这就是为什么你得到你得到的结果;他们是对的。带有scientific notation的负指数告诉我们。

例如,2E-10.2。您可以将数字写出,然后将小数点向左移动指数中给出的次数(如果指数为正数,则向右移动)。所以你的

5.957818181818184E-16

真的是:

0.0000000000000005957818181818184

...舍入到两个地方的是0.00