<p>合理的误差阈值(epsilon)是用于判断浮点数是否“足够接近”的极小正数,应依数值量级动态选择;Number.EPSILON适用于1附近,大数或小数需用相对误差阈值Math.abs(a - b) < epsilon * Math.max(Math.abs(a), Math.abs(b))。</p>

JavaScript 中浮点数精度问题无法完全避免,但可通过合理定义误差阈值(epsilon)来判断两个浮点数是否“足够接近”,从而规避直接用 === 或 == 比较带来的误判。
什么是合理的误差阈值(epsilon)
误差阈值是一个极小的正数,用于界定两个浮点数在多大范围内可视为相等。它不是固定常量,而应根据计算场景和数值量级动态选择。
-
默认推荐值:
Number.EPSILON(约2.220446049250313e-16)适用于1附近的数,是1与下一个可表示浮点数之间的差值; -
不适用于大数或小数:例如
1e10 + Number.EPSILON === 1e10为true,因为精度已丢失; -
更稳健的做法:使用相对误差阈值,即
epsilon * Math.max(Math.abs(a), Math.abs(b)),兼顾数量级差异。
如何安全比较两个浮点数
直接 a === b 在浮点运算后往往不可靠(如 0.1 + 0.2 !== 0.3),应封装为带容错的比较函数:
- 基础版本(固定 epsilon):
Math.abs(a - b) ; - 推荐版本(相对容差):
Math.abs(a - b) ; - 注意边界情况:若
a和b都为0,相对误差会失效,需单独处理或改用绝对容差。
常见场景下的阈值选择建议
不同用途对精度要求不同,阈值应匹配实际需求:
立即学习“Java免费学习笔记(深入)”;
-
金融计算:通常用整数单位(如“分”)避免浮点,若必须用浮点,建议绝对阈值
1e-6或更严(如1e-12); -
图形/物理引擎:坐标或向量比较常用
1e-5到1e-8,取决于单位尺度; -
科学计算:需结合算法误差分析,有时采用
10 × machine epsilon × max(|a|, |b|)作为经验上限。
避免常见误区
设定阈值时容易忽略的关键细节:
- 不要对所有场景硬编码
Number.EPSILON; - 不要混淆“舍入误差”和“算法误差”——前者可用 epsilon 补偿,后者需改进算法;
- 避免在循环中频繁创建新 epsilon 值,可预计算或封装为工具函数提升可读性与复用性。
不复杂但容易忽略:阈值不是越小越好,而是要与你的数据范围和业务容忍度匹配。


















