一、问题描述
示例代码1
float a = 1.0F-0.9F;
float b = 0.9F-0.8F;
System.out.println(a==b);
Float aa = Float.valueOf(a);
Float bb = Float.valueOf(b);
System.out.println(aa.equals(bb));
执行结果
false
false
示例代码2
BigDecimal a = new BigDecimal("1.0").subtract(new BigDecimal("0.9"));
BigDecimal b = new BigDecimal("0.9").subtract(new BigDecimal("0.8"));
System.out.println(a.compareTo(b)==0);
执行结果
true
二、问题分析
浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数,所以数据会存在误差,在实际比较中采用==进行比较容易出问题。
三、解决方案
1、使用BigDecimal的compareTo方法进行比较
如上述示例代码2
2、指定误差范围,两个浮点数的差值在该误差范围内视为相等,该方法存在风险
代码示例
float a = 1.0F-0.9F;
float b = 0.9F-0.8F;
float diff = 1e-6F;
System.out.println(Math.abs(a-b)<diff);