java 小数截断_java – 截断双倍到2位小数?

博客讨论了在Java中尝试将双精度值截断为两位小数时遇到的问题,指出双精度值由于其二进制表示无法精确表示所有十进制小数。作者提到了两种常见方法(DecimalFormat和BigDecimal),并指出这些方法在多数情况下有效,但在某些特定值上会出现不准确的结果,如2.00000000000005或19.97999999999。解决方案是使用BigDecimal进行十进制运算以确保正确舍入。
摘要由CSDN通过智能技术生成

我知道这个问题有很多重复,但请先看一下声明,而不是标记它已经回答了:)

为了截断双精度值2个小数位,我使用了两种方法,这些方法大多数都是提到的.它们如下

//this one

DecimalFormat dtime = new DecimalFormat("#.##");

return Double.valueOf(dtime.format(val));

//or the one below

BigDecimal bd = new BigDecimal(val);

BigDecimal rounded = bd.setScale(2, BigDecimal.ROUND_HALF_UP);

return rounded.doubleValue();

问题在于,对于这两种方式,我主要在数据集中获得正确的舍入值.但奇怪的是,同时我获得的值为2.00000000000005或19.97999999999.

我没有得到的问题是为什么只有少数几个值没有四舍五入.可能有什么不对?

解决方法:

For truncating the double values 2 decimal places I use two ways which are mostly mentioned everywhere.

他们都错了,因为他们正在尝试不可能的事情.没有截断双精度到2位小数的东西,因为双精度没有小数位.他们有二进制位置.有关证据,请参见my answer here.如果你想要小数位,你必须使用十进制基数,即BigDecimal或DecimalFormat.

标签:java,double,math

来源: https://codeday.me/bug/20190709/1410459.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值