Java浮点类型数据进行加减运算出现精度丢失问题
现象
在项目开发过程中,有一个需求是计算章节的总时长,由于是一个树形接口每一个叶子节点上都需要进行其下所有子节点的时长累加。最后结果出现了,进度丢失的问题,在系统前端界面设置了数据的入参精读为小数点后一位,但是在后端返回的数据却出现了丢失精度的问题。如图:
解决效果
问题分析
出现这样的问题,最终通过bug排查,最后在发现问题出现在后端,后端通过使用浮点型(double、float)数据进行的时长计算。那么问题就定位到了,使用浮点型数据进行加减运算很可能出现问题。通过查阅资料发现,的确使用浮点型数据进行运算会出现精度丢失的问题。
出现问题的原因
由于计算机进行运算例如加减运算都是通过二进制数进行运算。在进行运算的时候,都需要将数据转换成计算机能够进行运算的二进制数据,具体如何转换的过程就不必细说了,博主我也暂时不知道。目前的现象是浮点型数据在转换为二进度再由二进度转换为十进制的过程中是存在一些问题的。
解决办法
解决思路:
1.通过使用JDK自带的BigDecimal类进行浮点类型数据的运算。
2.将浮点数计算出的结果进行四舍五入,来获取到真实数据。
具体实现代码:
我这儿选中的是JDK自带的BigDecimal类进行浮点型数据运算,封装了一个专门用于计算float类型数据相加的方法
public static Float add(Float valueA, Float valueB) { BigDecimal numberA = new BigDecimal(Float.toString(valueA)); BigDecimal numberB = new BigDecimal(Float.toString(valueB)); return numberA.add(numberB).floatValue(); }