JavaScript中0.1+0.2===0.3返回false是因浮点数二进制精度限制,并非Bug;应避免直接用===比较,改用Number.EPSILON误差容忍判断或转整数运算。

JavaScript中0.1 + 0.2 === 0.3返回false,这是浮点数二进制表示的固有局限导致的精度丢失,并非Bug。解决的关键是**避免直接用===比较浮点结果,改用误差容忍判断或转整数运算**。
使用Number.EPSILON进行误差范围比较
ES6引入了Number.EPSILON(约2.22e-16),代表JS能表示的最小精度差值,适合做“近似相等”判断:
- 定义一个通用的浮点数相等函数:
function isEqual(a, b) { return Math.abs(a - b)isEqual(0.1 + 0.2, 0.3)→true - 注意:该方法适用于大多数场景,但对极大或极小数值需调整容差(如用相对误差)
乘以10的幂次转为整数再计算
对涉及金额、百分比等固定小数位的运算,最稳妥的方式是先放大为整数:
- 例如保留1位小数:
Math.round(0.1 * 10) + Math.round(0.2 * 10) === Math.round(0.3 * 10)→true - 封装成工具函数:
function add(a, b, decimals = 1) { const factor = Math.pow(10, decimals); return (Math.round(a * factor) + Math.round(b * factor)) / factor; }add(0.1, 0.2)→0.3
使用专门的数学库处理高精度需求
当项目频繁涉及金融计算或科学运算时,推荐引入成熟库:
立即学习“Java免费学习笔记(深入)”;
-
decimal.js:支持任意精度十进制运算,API简洁
Decimal.set({ precision: 20 }); new Decimal(0.1).plus(0.2).equals(0.3)→true -
big.js:轻量(
new Big(0.1).plus(0.2).equals('0.3')
避免在条件判断中直接使用浮点运算结果
尤其警惕if (a + b === c)这类写法:
- 改为
if (Math.abs(a + b - c) (根据业务精度选阈值) - 循环计数器不用浮点增量:
❌for (let i = 0.1; i (可能多执行一次或少执行)<br> ✅ <code>for (let i = 1; i










