JavaScript数值类型基于IEEE 754双精度浮点数,导致0.1+0.2≠0.3等精度问题;金融场景应转整数运算,小数比较需用Math.abs(a-b)<eps。

JavaScript 的数值类型看似只有一种 Number,实则处处是坑。它底层用 IEEE 754 双精度浮点数表示所有数字,这决定了精度丢失、比较失灵、大数失效等典型问题不是 bug,而是设计必然。
浮点数精度误差:0.1 + 0.2 ≠ 0.3 是常态
二进制无法精确表达多数十进制小数,0.1 和 0.2 在内存中本就是近似值,相加后误差叠加,结果为 0.30000000000000004。
- 金融或计费场景,统一转为整数运算(例如金额单位用“分”)
- 需要小数比较时,不直接用
===,改用差值判断:Math.abs(a - b) - 显示时用
.toFixed(n)(注意返回字符串)或Intl.NumberFormat控制位数和舍入
安全整数边界:超过 253−1 就不可靠
Number.MAX_SAFE_INTEGER 是 9007199254740991。超出后,相邻整数可能被判定相等,比如 9007199254740992 === 9007199254740993 返回 true。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 处理 ID、时间戳、大订单号等超大整数,改用
BigInt(末尾加n,如123456789012345678901234567890n) -
BigInt不能和Number混算,需显式转换,且不支持Math方法 - 校验是否为安全整数:用
Number.isSafeInteger(value)
输入值类型陷阱:HTML input 的 value 永远是字符串
哪怕 type="number",input.value 读出来仍是字符串。直接参与 + 运算会触发字符串拼接,/ 或 - 虽会隐式转数,但不可靠且难调试。
- 统一用
Number(input.value)转换,它对空格、纯数字字符串友好,对非法值返回NaN - 避免
parseInt和parseFloat,除非明确需要截断(如取整数部分或忽略单位) - 校验前先确认是有效数字:
typeof x === 'number' && !isNaN(x) && isFinite(x)
特殊值误判:NaN 不等于自己,Infinity 也是 Number
NaN、Infinity、-Infinity 都属于 Number 类型,但 NaN === NaN 为 false,typeof Infinity 也是 'number'。
- 检测
NaN必须用Number.isNaN()(推荐)或全局isNaN(),不能用=== - 区分普通有限数值:组合判断
typeof x === 'number' && isFinite(x) - 避免在计算中引入
Infinity,比如除零或超大指数运算,提前做边界检查

















