数码课堂
第二套高阶模板 · 更大气的阅读体验

两个浮点数怎么精确比较?别让精度问题坑了你(进阶教程)

发布时间:2026-01-17 19:11:45 阅读:176 次

写代码的时候,你有没有遇到过这样的情况:明明两个数看起来一样,用 == 一比,结果却是 false?比如 0.1 + 0.2 不等于 0.3。这其实是浮点数的“老毛病”——精度误差。

为什么浮点数不能直接比?

计算机用二进制存储小数,但很多十进制小数在二进制里是无限循环的。比如 0.1,在二进制中就是个无限循环小数,存的时候就被截断了,导致实际存储的是一个近似值。这么一来,两个看似相等的浮点数,内部可能差那么一丁点。

举个例子:

console.log(0.1 + 0.2 === 0.3); // 输出 false

看着离谱,其实很合理——0.1 + 0.2 的真实结果是 0.30000000000000004,和 0.3 差了一丢丢。

那该怎么比才靠谱?

办法很简单:别直接用 == 或 ===,而是判断两个数的差值是不是足够小。这个“足够小”的阈值,叫“容差”或“epsilon”。

比如这样写:

function floatEqual(a, b, epsilon = Number.EPSILON * 100) {
    return Math.abs(a - b) <= epsilon;
}

console.log(floatEqual(0.1 + 0.2, 0.3)); // 输出 true

Number.EPSILON 是 JavaScript 中表示 1 与“大于 1 的最小浮点数”之间的差值,用来做默认参考挺合适。乘个 100 是为了应对一些累积误差稍大的场景。

不同语言都得小心

不光是 JavaScript,Python、Java、C++ 都有这问题。比如 Python 里:

print(0.1 + 0.2 == 0.3)  # 输出 False

解决方法也类似,用 math.isclose() 就行:

import math
print(math.isclose(0.1 + 0.2, 0.3))  # 输出 True

在金融计算、安全校验、条件判断这些对数据准确性要求高的地方,忽略浮点精度问题,轻则结果出错,重则引发逻辑漏洞。比如判断用户余额是否够支付时,用错了比较方式,可能导致扣款失败或重复扣款。

所以,记住一句话:两个浮点数比较,别图省事用 ==,多走一步算差值,程序才更稳当。