在 Java 中,float 和 double 都是二进制浮点数,遵循 IEEE 754 标准,因此本身就无法精确表示很多十进制小数(如 0.1)。这是浮点数的固有特性,不是 bug。
如果你问的是“如何避免或减小误差”,可以从以下几个层面来解决:
BigDecimal(最推荐)BigDecimal 是 Java 中用于精确十进制运算的类型。
import java.math.BigDecimal;
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b); // 0.3 精确
⚠️ 注意:不要用 new BigDecimal(0.1)
new BigDecimal(0.1) // 错误,仍然是浮点误差
new BigDecimal("0.1") // 正确
设置精度和舍入方式:
BigDecimal result = a.divide(b, 10, RoundingMode.HALF_UP);
不要这样写:
if (a == b) // ❌
应该比较“误差范围”:
float EPSILON = 1e-6f;
if (Math.abs(a - b) < EPSILON) {
// 认为相等
}
浮点误差会累积:
// 不好
float sum = 0;
for (float x : list) sum += x;
// 更好(Kahan 求和)
float sum = 0;
float c = 0;
for (float x : list) {
float y = x - c;
float t = sum + y;
c = (t - sum) - y;
sum = t;
}
比如:
long cents = 12345; 表示 ¥123.45long price = 1999; // 19.99 元
这是金融系统最常用的方法。
| 类型 | 精度 | 适用场景 |
|---|---|---|
| float | 约 7 位十进制 | 图形、传感器 |
| double | 约 15 位 | 科学计算 |
| BigDecimal | 任意 | 金额、精确计算 |
避免 Float 误差的核心原则:
float/double 做金额或精确计算BigDecimal(字符串构造)如果你有具体场景(比如:金额计算 / 图形 / 算法),我可以给你更针对性的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。