javascript浮点数比较应避开误差:用number.epsilon容差判断相等;字符串需trim()转number并校验有限性;高精度场景用decimal.js;金额等固定小数位推荐整数化处理。

JavaScript 原生的 Number 类型基于 IEEE 754 双精度浮点数,无法精确表示很多十进制小数(如 0.1 + 0.2 !== 0.3),直接用 === 或大小运算符(、<code>>)比较容易出错。高精度比较的核心是:**避开浮点误差,统一数值表示,并采用确定性逻辑**。
用误差容限(EPSILON)做浮点数“相等”判断
这是最轻量、无需引入库的方案,适用于一般精度要求(如 UI 交互、配置校验):
- 不写
a === b,改用Math.abs(a - b) -
Number.EPSILON(约2.22e-16)适合普通双精度比较;对小数位明确的场景(如金额),可自定义更宽松的容差,例如1e-10或1e-6 - 封装成函数更安全:
const eq = (a, b, eps = Number.EPSILON) => Math.abs(a - b)
统一转数字 + 有效性校验再比较
用户输入、API 返回、localStorage 数据常为字符串,需预处理避免 NaN 和隐式转换陷阱:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 先
trim()去首尾空格,再用Number()转换(注意:Number("")得0,Number(" ")也得0) - 用
Number.isFinite()检查是否为有效有限数字(比typeof x === 'number' && !isNaN(x)更准确,能排除Infinity) - 示例:
const safeNum = (s) => { const n = Number(String(s).trim()); return Number.isFinite(n) ? n : 0; };<br>if (safeNum(val1) > safeNum(val2)) { ... }
使用 decimal.js 进行任意精度十进制比较
金融、科学计算等强一致性场景必须用专业库。decimal.js 的 cmp() 方法返回标准三态值(-1 / 0 / 1),语义清晰且无误差:
- 构造
Decimal实例时传入字符串(如new Decimal("0.1")),避免从原生Number初始化带来的初始误差 -
new Decimal("0.1").plus("0.2").cmp("0.3") === 0→true - 支持链式比较:
a.cmp(b) === 0 && b.cmp(c) ,也便于排序(<code>.sort((a, b) => a.cmp(b)))
整数化处理(推荐用于金额等固定小数位场景)
最可靠、零依赖的方式:把单位下移,全程用整数运算和比较:
- 金额统一用“分”存储和计算:
priceInCents = Math.round(priceInYuan * 100) - 所有加减乘除都在整数域进行,比较直接用
===或>即可 - 显示时再除以
100并格式化,例如(totalCents / 100).toFixed(2)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










