JavaScript Number类型基于IEEE 754双精度浮点格式,可精确表示最多15~16位十进制整数,安全整数范围为±(2⁵³−1);能表示的数值范围极大(如MAX_VALUE≈1.7977e+308),但不保证精度;小数运算存在固有精度误差,如0.1+0.2≠0.3。

JavaScript 的 Number 类型没有“最大位数”这个概念,它用的是 IEEE 754 双精度浮点格式(64 位),所以关键不是“多少位数字”,而是“能精确表示多少位十进制整数”以及“能表示多大或多么小的数”。
能精确表示的整数最多15~16位
虽然 JavaScript 可以显示像 1234567890123456789 这样19位的数字,但超过 15~16 位十进制整数时,就可能开始丢失精度:
- 安全整数范围是
-9007199254740991到9007199254740991(即 ±(2⁵³ − 1)),共 16 位十进制数; - 在这个范围内,每个整数都能被唯一、准确地表示;
- 超出后,比如
9007199254740992 + 1仍等于自身,因为相邻可表示的数之间出现间隔(>1); - 常见场景如后端传来的 18 位订单号、用户 ID,直接转成 Number 后末尾会变成
00或错乱。
能表示的最大/最小值远超整数范围
Number 可表示的数值范围极大,但这是靠指数部分实现的,并不意味着能精确表达那么多位:
-
Number.MAX_VALUE ≈ 1.7977e+308:约 309 位十进制数,但只是“数量级”,不是有效数字位数; -
Number.MIN_VALUE ≈ 5e-324:最接近 0 的正数,同样不反映精度; - 超过
MAX_VALUE得到Infinity;低于MIN_VALUE(非零)则下溢为0。
小数运算天然存在精度误差
由于二进制无法精确表示多数十进制小数,哪怕只有 1 位小数也会出问题:
立即学习“Java免费学习笔记(深入)”;
-
0.1 + 0.2 === 0.30000000000000004; - 小数最多保留约 17 位有效数字,但可靠比较必须用差值阈值(如
Math.abs(a - b) ); - 涉及金额、科学计算等场景,应避免直接用
Number做小数累加或判断相等。
应对超长数字的实际建议
遇到 ID、时间戳、大额金额等超出安全整数范围的数据,别硬塞进 Number:
- 后端返回长整数时,优先用字符串传输(如 JSON 中写
"id": "1234567890123456789"); - 需要计算的大整数,改用
BigInt(注意:不能和Number混用,需显式转换); - 金融类运算推荐专用库(如
decimal.js或big.js); - 校验是否安全整数,用
Number.isSafeInteger(n),比手动比大小更可靠。


















