<p>Number.EPSILON 提供浮点数比较的合理容差阈值,而非消除误差;因其代表1附近最小可分辨间隔(≈2.22e-16),故用 Math.abs(a - b) <= Number.EPSILON 判断“足够接近”。</p>

JavaScript 中用 Number.EPSILON 解决浮点误差,核心不是“消除”误差,而是提供一个合理的容差阈值,用于安全地比较两个浮点数是否“足够接近”,从而绕过直接用 === 或 == 比较带来的误判。
为什么需要 Number.EPSILON
JavaScript 使用 IEEE 754 双精度浮点数表示数字,导致很多十进制小数无法精确存储。例如:
0.1 + 0.2 === 0.3 // false(实际是 0.30000000000000004)
Number.EPSILON 是 1 与大于 1 的最小可表示数之间的差值,约等于 2.220446049250313e-16。它代表了在 1 附近能分辨的最小间隔,是衡量浮点数精度的天然单位。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用 EPSILON 做安全的相等比较
判断两个浮点数 a 和 b 是否“数学上相等”,应检查它们的差的绝对值是否小于等于某个容差。最常用且合理的方式是:
- 用
Math.abs(a - b) —— 适用于结果接近 0 或 1 的场景; - 更健壮的做法是相对误差比较:
Math.abs(a - b) ,能适应不同数量级; - 简单实用的封装函数:
function numbersEqual(a, b) {<br> return Math.abs(a - b) <= Number.EPSILON * Math.max(1, Math.abs(a), Math.abs(b));<br>}
这个版本对极小或极大数值都更鲁棒,避免因单用 Number.EPSILON 导致容差过小(如比较 1e10 级数字时)或过大(如比较 1e-20 时)。
常见误区提醒
-
Number.EPSILON不是万能精度开关,不能修复计算过程中的累积误差; - 不要把它当作“四舍五入”的替代品——该舍入还是得用
toFixed()或Math.round()配合幂运算; - 不适用于金融计算等高精度场景,此时应改用整数(如以分为单位)或专用库(如
decimal.js); - 比较
0和极小负数(如-0)时需额外注意符号,Object.is(0, -0)才能区分。
什么时候该用,什么时候不该用
适合用 Number.EPSILON 的情况:
- 单元测试中验证浮点运算结果(如
expect(result).toBeCloseTo(expected)底层逻辑类似); - 图形、物理模拟中判断两个坐标/向量是否重合;
- 算法中需要“近似相等”作为终止条件(如牛顿法收敛判断)。
不适合的场景:
- 用户输入的金额、百分比显示——应格式化后展示,按业务规则取整;
- 涉及累加、迭代多次的精度敏感计算——误差可能放大,需用更高精度策略;
- 与后端或其他语言交互时的数值一致性校验——需约定统一的精度处理方式,而非仅靠 JS 一侧容差。

















