合普知识库
柔彩主题三 · 更轻盈的阅读体验

浮点数比较精度:为什么0.1 + 0.2 不等于 0.3?

发布时间:2025-12-15 14:28:16 阅读:231 次

你有没有在写程序时遇到过这样的情况:明明计算的是0.1加0.2,结果却不是0.3?比如在JavaScript里输入 0.1 + 0.2 === 0.3,返回的却是 false。这并不是程序出错了,而是浮点数精度问题在作祟。

计算机怎么存小数?

我们日常用十进制算数,但计算机底层用的是二进制。像0.5、0.25这些能被2整除的小数,在二进制里可以精确表示。但0.1就不行——它在二进制中是无限循环小数,就像1/3在十进制中是0.333...一样,只能截断存储。

所以当你写下0.1时,计算机实际存的是一个非常接近0.1的近似值。多个这样的近似值做运算,误差就会累积。

一个常见的“bug”场景

比如你在做一个购物车功能,两件商品分别0.1元和0.2元,合计显示0.3元没问题,但如果用代码判断是否等于0.3元来触发优惠,可能永远触发不了。

const price = 0.1 + 0.2;
if (price === 0.3) {
console.log("满足优惠条件");
} else {
console.log("不满足"); // 实际会输出这里
}

结果让你一头雾水,其实是因为 price 的真实值是 0.30000000000000004

怎么安全地比较小数?

别直接用全等或相等符号比浮点数。更稳妥的方式是设定一个足够小的“误差范围”,只要两个数的差距小于这个范围,就认为它们相等。

function isEqual(a, b, tolerance = 1e-10) {
return Math.abs(a - b) < tolerance;
}

console.log(isEqual(0.1 + 0.2, 0.3)); // true

这种做法在金融计算、动画帧率控制、物理引擎等对数值敏感的场景中很常见。

其他语言也这样吗?

不只是JavaScript,Python、Java、C++等几乎所有使用IEEE 754标准浮点数的编程语言都会遇到这个问题。它是计算机底层表示方式决定的,不是某个语言的缺陷。

如果你处理的是金额,建议用整数单位(比如分)来计算,避免小数。或者使用专门的高精度库,如Python的 decimal 模块。

理解浮点数的局限性,能帮你少掉很多“莫名其妙”的坑。下次再看到0.1 + 0.2 ≠ 0.3,你就知道,不是数学变了,是计算机的“算术习惯”和我们不一样。