精度缺失导致数据失准问题解决
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这种模式得才得以解决问题。
看来代码中虽然没明显标红得也未必就是百分百正确得用法,提示得东西还是得注意下得