我想将我的double值舍入到N个小数位(比如说一个),实际上只是省略了后面的所有数字:
0.123 #=> 0.1
0.19 #=> 0.1
0.2 #=> 0.2
这个问题已经提出了很多次,例如here和here.推荐的方法是使用BigDecimal然后缩放它,特别是为了避免昂贵的转换为字符串和返回.我需要的舍入模式显然是RoundingMode.DOWN.
所以方法是这样的:
static double truncate(double value, int places) {
return new BigDecimal(value)
.setScale(places, RoundingMode.DOWN)
.doubleValue();
}
但是,由于精度的降低,它会带来一些意想不到的结果:
truncate(0.2, 1) #=> 0.2
truncate(0.3, 1) #=> 0.2
truncate(0.4, 1) #=> 0.4
truncate(0.2, 3) #=> 0.2
truncate(0.3, 3) #=> 0.299
truncate(0.4, 3) #=> 0.4
这引出了两个问题:
>它应该如何适用于0.3?为什么在这种情况下会失去精确度?它不会破坏BigDecimal的全部目的吗?
>如何正确截断我的值?
谢谢.