在 Java 里,float(以及 double)出现“计算出错 / 不相等 / 精度丢失”是正常现象,根本原因有三点:二进制无法精确表示部分十进制小数、浮点数标准本身的局限、以及比较方式不当。
下面用通俗 + 示例说明。
计算机用 二进制 存储数字,而很多十进制小数在二进制里是无限循环小数。
例如:
float a = 0.1f;
0.1 在二进制里是:
0.0001100110011001100110011...(循环)
但 float 只有 23 位尾数,必须截断,所以:
0.1f ≠ 真实的 0.1
System.out.println(0.1f + 0.2f);
// 输出:0.30000001192092896
Java 的 float / double 遵循 IEEE 754 标准:
| 类型 | 位数 | 精度 |
|---|---|---|
| float | 32 | 约 6~7 位十进制 |
| double | 64 | 约 15~16 位十进制 |
float a = 10000000f;
float b = a + 0.1f;
System.out.println(b); // 10000000.0
== 比较浮点数❌ 错误写法:
if (a == b) { ... }
✅ 正确写法(允许误差):
if (Math.abs(a - b) < 1e-6) { ... }
float money = 0.1f + 0.2f;
❌ 不要用 float / double 算钱
✅ 用:
BigDecimal
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 0.3
float sum = 0;
for (int i = 0; i < 10000; i++) {
sum += 0.1f;
}
结果 ≠ 1000
float f = 1.2f;
double d = f;
float → double 看似安全,但原误差被保留
✅ 适合:
❌ 不适合:
Java 的 float 出错,不是 bug,而是“二进制 + IEEE754 + 精度有限”的必然结果。
如果你愿意,我可以:
你想看哪一个?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。