java 小数截断_java – 如何截断双精度到N位小数?

博客讨论了在Java中使用BigDecimal进行数值截断时遇到的不期望的结果,特别是在涉及到小数舍入时。作者指出,对于特定值如0.3,BigDecimal的RoundingMode.DOWN会导致精度损失。文章提出了关于正确截断值的疑问,并寻求解决方案。
摘要由CSDN通过智能技术生成

我想将我的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的全部目的吗?

>如何正确截断我的值?

谢谢.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值