直接用 === 或

直接用 === 或 比较两个浮点数容易出错,因为二进制无法精确表示多数十进制小数(如 <code>0.1 + 0.2 !== 0.3)。正确做法是引入一个极小的误差容限(epsilon),判断两数差的绝对值是否小于该阈值。
使用固定 epsilon 进行绝对误差比较
适用于数量级相近、且对精度要求明确的场景(如 UI 计算、简单数值校验)。
- 选取典型 epsilon 值:如
1e-10(高精度)、1e-6(常见工程精度) - 比较逻辑:
Math.abs(a - b) - 示例:
function equals(a, b, eps = 1e-10) { return Math.abs(a - b)
使用相对 epsilon 处理大数或跨量级比较
当 a 和 b 可能很大(如 1e20)或相差多个数量级时,仅靠绝对误差会失效。此时应基于较大值的量级动态调整容限。
- 公式:
Math.abs(a - b) - 避免除零:用
Math.max替代除法更安全 - 可合并绝对与相对误差(更鲁棒):
function nearlyEqual(a, b, absEps = 1e-10, relEps = 1e-12) { const diff = Math.abs(a - b); if (diff
利用 Number.EPSILON 做机器精度级比较
Number.EPSILON 表示 1 与大于 1 的最小可表示数之间的差(约 2.22e-16),适合判断“是否在浮点数表示极限内相等”。
- 注意:它不是通用 epsilon,不能直接用于任意数值(因精度随数值增大而降低)
- 推荐用法:仅用于接近 1 的数,或作为相对容限的基准
function isOneUnitEqual(a, b) { return Math.abs(a - b) - MDN 明确指出:
Number.EPSILON不是“最小可表示数”,也不代表所有数的最小差值
实际建议与避坑提示
日常开发中,选择策略取决于具体场景:
- 做数学计算验证(如单元测试)→ 用带
absEps + relEps的混合判断 - 图形/动画坐标比较(值通常在 [-1000, 1000])→ 固定
1e-6足够 - 金融计算 → 别用浮点数!改用整数分或
BigInt+ 定点运算 - 避免重写已有工具:Lodash 有
_.isEqual(支持数字近似),D3、Three.js 等库也内置类似epsilonEquals方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











