JavaScript中浮点数比较不能直接用===或==,因IEEE 754双精度无法精确表示十进制小数(如0.1、0.2),导致0.1+0.2!==0.3为true;应使用Math.abs(a-b)<ε进行误差容忍比较。

JavaScript 中 Number 类型的浮点数比较不能直接用 === 或 == 判断相等,因为二进制浮点表示存在精度误差,比如 0.1 + 0.2 !== 0.3 是 true。关键在于理解误差来源,并采用合适策略处理。
为什么浮点数比较会出错
IEEE 754 双精度浮点数无法精确表示大多数十进制小数(如 0.1、0.2),它们在内存中是近似值。运算后误差可能累积,导致看似相等的数在底层 bit 表示上不同。例如:
console.log(0.1 + 0.2); // 输出 0.30000000000000004
这不是 JavaScript 的 bug,而是所有遵循 IEEE 754 的语言共有的限制。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
使用误差容忍度(EPSILON)进行近似比较
最常用且可靠的方式是定义一个极小的容差值(如 Number.EPSILON),判断两数差的绝对值是否小于该容差:
-
Number.EPSILON约为2.220446049250313e-16,适合比较接近 1 的数;对较大或较小数值,需按比例调整容差 - 推荐写法:
Math.abs(a - b) ,其中 <code>tolerance可取Number.EPSILON * Math.max(1, Math.abs(a), Math.abs(b)) - 简单场景可固定容差,如
Math.abs(a - b) (适用于常规计算)
避免比较的替代方案
若业务逻辑允许,优先从源头规避浮点误差:
- 金钱计算用整数(单位:分),避免小数运算
- 需要高精度时,用
BigInt处理整数,或引入decimal.js、big.js等库处理十进制 - 显示前四舍五入(如
parseFloat((a).toFixed(10))),但注意toFixed返回字符串,且仅影响显示不改变数值本身
特殊情况:NaN 和 Infinity 的比较
NaN 与任何值(包括自身)都不相等,必须用 isNaN() 或 Number.isNaN() 判断;Infinity 和 -Infinity 可直接用 === 比较:
-
NaN === NaN // false,应写Number.isNaN(x) Infinity === Infinity // true-
Object.is(NaN, NaN) // true,这是唯一能正确识别 NaN 相等的内置方法

















