1、业务描述
最近有个业务需求,需要给门店做个大屏展示业务功能,推广业务使用。其中有个字段是返回一个2位小数的比例。例如使用率 use=2.2%
2、问题描述
有一天大屏显示突然出现了2.1999999999%,将这个数值展示到大屏上,需要紧急修复。
3、问题代码
double v = (new BigDecimal(confirmedAbnormalCount).divide(new
BigDecimal(abnormalBillCount), 4, RoundingMode.HALF_UP)).doubleValue();
l2Ratio = (v*100)+"%";
l2Ratio = (v*100)+"%";出现double精度缺失问题。
认真反思,还是自己没有真正理解在Java中,float和double都是浮点数,是二进制数值表示的,就可能出现精度缺失问题。所以处理float和double类型数值时,必须注意精度问题。
4、问题解决
double v = (new BigDecimal(confirmedAbnormalCount).divide(new
BigDecimal(abnormalBillCount), 4, RoundingMode.HALF_UP)).multiply(new
BigDecimal(100)).setScale(2,RoundingMode.HALF_UP).doubleValue();
l2Ratio = Double.toString(v) + "%";
5、收获与反思
①关于double和float类型的加减乘除必须使用BigDecimal。
②更加理解计算机中浮点数二进制表示会导致精度问题。
解决问题中有篇文章感觉不错,分享给大家。
https://blog.csdn.net/qq_35868412/article/details/89029288