精度缺失导致数据失准问题解决

Double Bigdecimal模式下得精度缺失

使用jep进行负责公司计算,最开始使用得参数数据格式是Double出现精度缺失问题。于是将参数数格式改成Bigdecimal即使用了jep得Bigdecimal,原先存在得精度缺失问题解决,然后又出现了新得精度缺失问题。问题如下

Bigdecimal模式下得精度缺失

在这里插入图片描述
如上图 计算所得值为40.595,取位2位后应该为 40.60,可是代码中取位2位后为40.59是错误得值。
逐步断点打印调试发现,是因为计算所得结果为40.59499999所以取位为40.59。
即计算过程出现精度缺失

问题所在及解决方法

调试发现,计算过程值均正确
jep.evaluate()
((Number) jep.evaluate()).doubleValue()
以上2个计算结果均为40.595
只有经过下列语句后,计算结果为40.5949999.因此得到具体错误语句
BigDecimal ret =new BigDecimal(((Number) jep.evaluate()).doubleValue());
并将上局改成下列语句后,计算结果为40.595并且取2位所得结果为 40.60
BigDecimal ret =BigDecimal.valueOf(((Number) jep.evaluate()).doubleValue());

结论心得

很震惊,据说BigDecimal是精度缺失得克星,可是这波经历下来看来也未必百分百不会出现精度缺失问题。就是BigDecimal确实不会出现精度缺失,可是如果使用得方式不恰当,也还是不可避免会出现问题得。
差错过程中一直不相信BigDecimal出现精度缺失,打印出结果又确实精度缺失了,百思不得其间解,发现,new BigDecimal(((Number) jep.evaluate()).doubleValue());中BigDecimal一直被黄色小色块标识,点击看,提示改成BigDecimal.valueOf这种模式得才得以解决问题。
看来代码中虽然没明显标红得也未必就是百分百正确得用法,提示得东西还是得注意下得

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值