我尝试将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。示例值:
我在这里缺少什么?
谢谢!
答案 0 :(得分:4)
您在那里测试的四个值应四舍五入为0.0!
5.957818181818184E-16
等于5.95... * 10^(-16)
等于0.000...0595...
,在第一个非零数字前面有16个零。类似于您的其他价值观。您熟悉scientific notation吗?
答案 1 :(得分:2)
您引用的所有示例都是非常非常非常小的数字。如果将它们四舍五入到两个位置,则结果为零。这就是为什么你得到你得到的结果;他们是对的。带有scientific notation的负指数告诉我们。
例如,2E-1
为0.2
。您可以将数字写出,然后将小数点向左移动指数中给出的次数(如果指数为正数,则向右移动)。所以你的
5.957818181818184E-16
真的是:
0.0000000000000005957818181818184
...舍入到两个地方的是0.00
。