Number.EPSILON是JavaScript中1与大于1的最小可表示数之差,约2.220446049250313e-16,用于浮点数安全比较;它不是通用误差容限,需配合Math.abs(a-b)和量级基准(如Math.max(Math.abs(a),Math.abs(b)))使用。

Number.EPSILON 是 JavaScript 中表示 1 与大于 1 的最小可表示数之间差值的常量,其值约为 2.220446049250313e-16。它不是“任意小数的通用误差容限”,而是用于浮点数**安全比较**的基准单位,尤其适用于判断两个数是否“在浮点精度范围内相等”。
为什么需要 Number.EPSILON?
JavaScript 使用 IEEE 754 双精度浮点数表示数字,导致很多十进制小数无法精确存储(如 0.1 + 0.2 !== 0.3)。直接用 === 比较结果可能为 false,即使数学上应相等。Number.EPSILON 提供了一个与数值尺度匹配的、合理的精度阈值参考——但它本身**不随操作数大小自动缩放**,需配合绝对差值使用。
正确用法:相对误差比较(推荐)
对大多数场景,应将误差与参与比较的较大数值的量级关联,避免对大数或小数失效:
- 计算两数之差的绝对值:
Math.abs(a - b) - 选取合适的基准值,常用
Math.max(Math.abs(a), Math.abs(b)) - 判断是否小于
基准值 × Number.EPSILON(或乘以一个合理倍数,如 10)
示例函数:
function numbersEqual(a, b, tolerance = Number.EPSILON) {
if (a === b) return true; // 处理完全相等或 NaN 等边界
const diff = Math.abs(a - b);
const scale = Math.max(Math.abs(a), Math.abs(b));
return diff 调用 numbersEqual(0.1 + 0.2, 0.3) 返回 true;而 numbersEqual(1e10, 1e10 + 1) 仍返回 false(因 1 远大于 1e10 × EPSILON ≈ 1e-6),符合预期。
常见误区与注意事项
-
不要直接用
Math.abs(a - b):这对接近 0 的数尚可,但对大数(如1000000)完全失效——此时EPSILON小得毫无意义 -
EPSILON 不是“全局精度开关”:它仅反映双精度下 1 附近的最小间隔;更大数值的相邻可表示数间距会指数级增大(如
2^53之后整数无法精确表示) -
业务场景需自定义容差:金融计算可能要求
1e-2(分),物理模拟可能用1e-9,EPSILON 仅作底层参考,不可照搬
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











