JavaScript安全整数最大值为9007199254740991,源于IEEE 754双精度浮点数52位尾数限制,超过2⁵³后出现精度空隙;可用Number.isSafeInteger()检测,超大整数推荐BigInt、字符串+专用库或后端协同处理。

JavaScript 中能安全表示的整数最大值是 9007199254740991,即 Number.MAX_SAFE_INTEGER,约等于 9 × 10¹⁵。
为什么是这个数?
JavaScript 使用 IEEE 754 双精度浮点数格式存储数字,共 64 位:1 位符号、11 位指数、52 位尾数(有效数字)。虽然能表示更大的整数(如 Number.MAX_VALUE ≈ 1.8 × 10³⁰⁸),但超过 2⁵³(即 9007199254740992)后,连续整数无法被唯一表示——相邻可表示的数之间出现“空隙”,导致 n === n + 1 这类错误判断。
例如:
console.log(9007199254740991 + 1 === 9007199254740992); // true ✅
console.log(9007199254740992 + 1 === 9007199254740992); // true ❌(实际丢失精度)
立即学习“Java免费学习笔记(深入)”;
如何检测是否超出安全整数范围?
- 使用
Number.isSafeInteger(num)—— 返回布尔值,内部检查是否为整数且在[-MAX_SAFE_INTEGER, MAX_SAFE_INTEGER]内 - 手动比较:
num = Number.MIN_SAFE_INTEGER && Number.isInteger(num) - 对大整数运算(如 ID、时间戳、金额)务必校验,避免隐式转换出错
处理超大整数的替代方案
-
BigInt:ES2020 引入,用后缀
n声明(如123n),支持任意精度整数运算,但不能与普通number混用(会报错) - 字符串 + 专用库:如
big-integer、decimal.js或bn.js,适合金融计算或密码学场景 - 后端协同:将大整数以字符串形式传输和存储,前端仅做展示或轻量解析,关键计算交由服务端完成
常见踩坑场景
- 从 API 接收长整型 ID(如 MongoDB ObjectId 时间戳部分、雪花 ID)时,若后端返回 number 类型,可能被 JS 自动转成不精确值
- 使用
Date.now()在 2038 年后仍安全(当前值约 1.7×10¹²),但叠加毫秒级高精度计时或大跨度差值计算时需留意 - JSON.parse() 会把大整数转为 number,导致精度丢失;建议后端对大整数字段统一用字符串传输










