浮点数运算精度丢失
案例
float a = 2.0f - 1.9f; float b = 1.8f - 1.7f; System.out.println(a);// 0.100000024 System.out.println(b);// 0.099999905 System.out.println(a == b);// false
分析
计算机使用二进制存储信息,在表示数字时,宽度是有闲的,无限循环的小数存储在计算机中,只能被截断,所以会导致小数精度发生损失。【浮点数无法准确的使用二进制精确的表示】
解决浮点数运算精度丢失
BigDecimal
可以实现对浮点数的运算并且不会造成精度丢失。通常设计到钱的场景,都是通过
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);
System.out.println(x); /* 0.1 */
System.out.println(y); /* 0.1 */
System.out.println(Objects.equals(x, y)); /* true */