number.max_safe_integer 是 9007199254740991(2⁵³−1),表示 javascript 中能精确表示且安全运算的最大整数;因其基于 ieee 754 双精度格式,53 位有效精度限制了整数唯一表示范围,超出后出现精度丢失。

Number.MAX_SAFE_INTEGER 表示 JavaScript 中能**精确表示的最大整数**,它的值是 9007199254740991(即 2⁵³ − 1)。
为什么是 2⁵³ − 1?
JavaScript 使用 IEEE 754 双精度浮点格式存储数字,其中有效数字(尾数)占 53 位(含 1 个隐含位)。这意味着它最多能**无歧义地表示 53 位二进制整数**。超过这个范围后,相邻可表示的整数之间会出现间隔,导致“丢失精度”——比如 9007199254740992 === 9007199254740993 返回 true,因为它们被映射到同一个浮点值。
“安全”的含义是什么?
“Safe” 指的是:在这个范围内,每个整数都有唯一、准确的双精度浮点表示,且所有整数运算(加、减、乘等)只要结果仍在该范围内,就不会因浮点舍入而产生意外误差。
- ✅
Number.MAX_SAFE_INTEGER + 1仍能正确表示为9007199254740992 - ❌
Number.MAX_SAFE_INTEGER + 2实际等于9007199254740992(不是9007199254740993),已不安全 - ⚠️ 即使数值本身没超,参与运算的中间结果若溢出安全范围,也可能引入误差
实际开发中要注意什么?
它不是整数上限(Number.MAX_VALUE 是约 1.8×10³⁰⁸),而是**精度保障边界**。常见易错场景:
- 处理大 ID(如数据库主键、时间戳毫秒数)时,若超过此值,用
===比较或做算术可能出错 - 循环计数器、数组索引一般不会触及(数组最大长度约 2³²−1),但长整型 ID 或金融计算需警惕
- 需要更高精度时,应改用
BigInt(如9007199254740991n + 1n)
如何检查一个数是否“安全”?
可用内置方法:
-
Number.isSafeInteger(9007199254740991)→true -
Number.isSafeInteger(9007199254740992)→false - 注意:该方法同时检查是否为整数、是否在
[−MAX_SAFE_INTEGER, MAX_SAFE_INTEGER]内
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











