number.epsilon 是 javascript 中表示 1 与大于 1 的最小可表示浮点数之差的常量(≈2.22e-16),用于设定误差容忍边界,通过比较差值是否小于该值来安全判断浮点数近似相等,而非修复浮点运算本身。

JavaScript 中浮点数运算的误差无法彻底“解决”,但可以用 Number.EPSILON 来**合理判断两个浮点数是否足够接近,从而规避直接用 === 比较带来的误判**。它不是修复计算过程,而是提供一个科学的误差容忍边界。
什么是 Number.EPSILON?
Number.EPSILON 是 JavaScript 中表示“1 与大于 1 的最小可表示浮点数之间的差值”,其值约为 2.220446049250313e-16(即 2⁻⁵²)。它反映的是双精度浮点数在数值 1 附近能分辨的最小间隔。
注意:Number.EPSILON 不是全局最小精度,浮点数精度随数值大小变化(越大的数,相邻可表示数的间隔越大),所以它最适用于比较接近 1 的数;对其他数量级,需按比例缩放。
为什么直接比较浮点数会出错?
因为二进制无法精确表示很多十进制小数(如 0.1 + 0.2):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
0.1 + 0.2 === 0.3 // false
0.1 + 0.2 // 0.30000000000000004
这不是 JS 的 bug,而是 IEEE 754 双精度浮点数的标准限制。直接用 == 或 === 判断等于,极易失败。
如何用 Number.EPSILON 做安全的相等判断?
核心思路:不检查“完全相等”,而检查“差值是否小于可接受的误差范围”。推荐写一个通用的近似相等函数:
- 基础版(适合数值在 1 左右):
function numbersEqual(a, b) {<br> return Math.abs(a - b) }numbersEqual(0.1 + 0.2, 0.3); // true - 增强版(适配任意大小的数,更健壮):
function nearlyEqual(a, b) {<br> const diff = Math.abs(a - b);<br> const scale = Math.max(Math.abs(a), Math.abs(b), 1);<br> return diff }
这样对大数(如1e10 + 1和1e10)也能合理容忍相对误差。 - 实际开发中,也可直接使用已验证的库函数,比如 Lodash 的
_.isEqual(对数字自动做近似比较)或自定义工具函数,避免重复造轮子。
哪些场景不该只靠 EPSILON?
-
需要精确十进制计算时(如金融计算):应改用字符串运算、整数单位(如“分”代替“元”)、或专用库(如
decimal.js、big.js)。 - 累积运算误差明显时(如循环累加 0.1 一百次):单次用 EPSILON 判断不够,需重构逻辑(例如用整数计数再除以 10)。
- 和用户输入/后端数据比对时:确保双方都使用相同精度处理,避免前端用 EPSILON、后端用截断导致不一致。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










