Java中处理浮点数运算时,由于float和double类型基于IEEE 754标准,存在精度丢失问题。直接使用它们进行计算,比如加减乘除,可能会导致不符合预期的结果。例如
0.1 + 0.2并不等于
0.3,而是接近的近似值。要正确处理这类问题,需采用更精确的方式。
BigDecimal进行高精度计算对于需要精确结果的场景,如金融计算、金额处理等,应使用java.math.BigDecimal类。
注意:不要用double构造函数创建BigDecimal,这会继承double的精度问题。
错误写法:new BigDecimal(0.1)—— 这实际得到的是
0.1000000000000000055511151231257827021181583404541015625
正确做法是使用字符串构造函数:
new BigDecimal("0.1") —— 精确表示0.1add()、
subtract()、
multiply()、
divide()
示例:
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal sum = a.add(b); // 结果为 0.3
由于浮点数存储的近似性,不能用
==判断两个double是否相等。
应该使用“误差范围”(delta)进行比较:
1e-9
示例:
double d1 = 0.1 + 0.2; double d2 = 0.3; boolean isEqual = Math.abs(d1 - d2) < 1e-9; // true
根据使用场景决定浮点类型:
如果金额可以用整数表示(如以分为单位),优先使用long或int,从根本上避免浮点问题。
处理浮点数时记住:
基本上就这些,不复杂但容易忽略。