JavaScript的Number类型完全基于IEEE 754双精度浮点格式(64位),无整数类型,所有数字均按1-11-52结构存储;可精确表示整数范围为±(2⁵³−1),小数如0.1因二进制无限循环被截断导致精度误差。

JavaScript 的 Number 类型完全基于 IEEE 754 双精度浮点格式(64 位),没有单独的整数类型——所有数字,包括 42、0、3.14 和 0.1,都按同一套规则存储和运算。理解这个标准,是写出稳定数值逻辑的关键。
64 位怎么拆:1-11-52 结构
每个 Number 在内存中严格占用 64 位,分为三段:
- 1 位符号位:0 表示正数,1 表示负数
- 11 位指数位:存储值 = 实际指数 + 1023(偏移量),所以实际指数范围是 −1022 到 +1023
-
52 位尾数位:实际有效数字共 53 位,因为规格化数隐含一个前导 1(即形如
1.xxxx)
例如整数 1 的二进制是 1.0,规格化后尾数全为 0,指数为 0 → 存储指数为 1023(二进制 01111111111),符号位为 0,就构成完整表示。
能精确表示哪些整数?
由于只有 53 位有效精度,JavaScript 能唯一、无歧义地表示所有绝对值 ≤ 2⁵³ − 1 的整数:
立即学习“Java免费学习笔记(深入)”;
Number.MAX_SAFE_INTEGER === 9007199254740991Number.MIN_SAFE_INTEGER === -9007199254740991
超过这个范围,相邻可表示数的间隔 ≥ 2,导致整数“合并”。比如:9007199254740992 === 9007199254740993 返回 true。
这不是 bug,而是双精度浮点数的自然限制。
为什么 0.1 + 0.2 ≠ 0.3?
十进制小数 0.1 和 0.2 在二进制中是无限循环小数(类似十进制中 1/3 = 0.333…),而 IEEE 754 只能保留 53 位有效数字,必须截断或舍入。存储值本身就有微小偏差,相加后误差叠加,结果变成 0.30000000000000004。
- 这类误差不是 JavaScript 特有,而是所有遵循 IEEE 754 的语言共有的数学限制
- 只有形如
m / 2ⁿ(其中m、n为整数)的小数才能被精确表示,例如0.5、0.25、0.125
特殊值如何编码?
IEEE 754 预留特定比特模式表达非数值:
-
±0:指数全 0 + 尾数全 0;符号位决定正负(
1 / -0得-Infinity) - ±Infinity:指数全 1 + 尾数全 0
-
NaN:指数全 1 + 尾数非全 0;所有 NaN 都不等于自身(
NaN === NaN为false)
Number.NaN、Infinity、-Infinity 是这些底层编码的语义封装,不是魔法常量。


















