1.浮点数加减乘除运算后的等值判断
总结:浮点数加减乘除运算后的等值判断,不能直接使用 == 或者 equals 来判断。因为浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。二进制无法精确表示大部分的十进制小数。
反例:
Float c = 1.0f;
System.out.println(c);//1.0
Float d = 0.9f;
System.out.println(d);//0.9
Float e = 0.9f;
Float f = 0.8f;
System.out.println(f);//0.9
Float result1 = c - d;
System.out.println(result1);//0.100000024
Float result2 = e - f;
System.out.println(result2);//0.099999964
if (result1.equals(result2)) {
System.out.println(true);//不会进来
}
正例:
使用 BigDecimal 来定义值,再进行浮点数的运算操作。
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);
BigDecimal y = b.subtract(c);
if (x.compareTo(y) == 0) {
System.out.println("true");
}
2.BigDecimal 规范
总结:禁止使用构造方法 BigDecimal(double) 的方式把 double 值转化为 BigDecimal 对象,new BigDecimal("") 内部用String类型来转换才不会出现误差
反例:
BigDecimal bigDecimal = new BigDecimal(d);
System.out.println(bigDecimal); //0.89999997615814208984375
BigDecimal bigDecima2 = BigDecimal.valueOf(d);
System.out.println(bigDecima2); //0.899999976158142
正例:
BigDecimal bigDecima3 = new BigDecimal(d.toString());
System.out.println(bigDecima3); //0.9