Number.MAX_SAFE_INTEGER 是 9007199254740991(2⁵³−1),表示 JavaScript 中能被精确表示且安全参与运算的最大整数;超出后因 IEEE 754 双精度浮点数仅 53 位有效精度,会导致整数精度丢失、比较失真及隐式错误。

Number.MAX_SAFE_INTEGER 是 JavaScript 中表示“安全整数”的最大值,即 2<sup>53</sup> − 1(9007199254740991)。它不是数值上限,而是能被精确表示、不会因浮点精度丢失而产生意外结果的最大整数。正确理解并使用它,关键在于识别哪些场景需要它、哪些操作会突破它。
什么时候必须关注 MAX_SAFE_INTEGER?
当涉及以下操作时,超出该值可能导致逻辑错误或数据失真:
- 唯一 ID 生成(如前端自增 ID、时间戳拼接 ID)
- 大额金额计算(尤其未用 BigInt 或 decimal 库时)
- 数组索引超过
2<sup>53</sup> − 1(虽然实际中几乎不会遇到) - 与后端交互时,JSON 解析大整数(JavaScript 会自动转成近似值)
如何检测是否超出安全范围?
不能只靠 > Number.MAX_SAFE_INTEGER 判断,因为加法/乘法可能在不显式超限的情况下已丢失精度。推荐方式:
- 用
Number.isSafeInteger(n)检查单个数值是否安全(包括正负和零) - 对运算结果立即验证:
Number.isSafeInteger(a + b) && a + b === a + b(后者是冗余检查,实际只需前者) - 输入校验:接收字符串型数字时,先用
BigInt或正则判断位数,再转 Number 并验证
超出后的实用应对策略
一旦可能越界,避免强行用 Number 处理:
- 优先用
BigInt(需后缀n或BigInt(str)),支持任意精度整数运算 - 对 ID 类字段,统一用字符串传输和存储,避免 Number 转换
- 金融计算改用专用库(如
decimal.js或big.js) - 后端返回大整数时,用 JSON 的字符串字段(如
"id": "9007199254740992"),前端保持字符串处理
常见误区提醒
很多人误以为只要数值 ≤ MAX_SAFE_INTEGER 就绝对安全,但要注意:
-
9007199254740992 === 9007199254740993返回true(二者在 JS 中表示为同一个 double 值) -
Math.pow(2, 53) + 1无法被精确表示,结果仍是9007199254740992 -
JSON.parse('{"n":9007199254740992}')中的n已经不准确,应传字符串
安全边界不是用来“突破”的红线,而是提醒你在整数精度敏感场景中切换更合适的类型或协议。


















