【发布时间】:2022-03-06 16:36:06
【问题描述】:
我想将我的 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的全部目的吗?如何正确截断我的值?
谢谢。
【问题讨论】:
标签: java rounding bigdecimal