javascript的number类型统一采用ieee 754双精度浮点格式,64位分1位符号、11位指数(偏移量1023)、52位尾数(隐含前导1),可精确表示绝对值≤2⁵³−1的整数,小数因二进制无限循环导致精度丢失,极值与nan/infinity由特定比特模式定义。

JavaScript 的 Number 类型统一采用 IEEE 754 双精度浮点格式,固定占用 64 位(8 字节)内存,不区分整数与小数。所有数字——包括 42、0.1、Infinity、NaN——都按同一套规则存储和运算。
64 位结构:1-11-52 拆分
每个 Number 在内存中严格划分为三段:
- 1 位符号位:0 表示正数,1 表示负数
- 11 位指数位:采用偏移量(Bias = 1023),真实指数 = 存储值 − 1023,有效范围是 −1022 到 +1023
-
52 位尾数位(也称“小数位”):隐含一个前导 1,实际有效精度为 53 位二进制(即规格化形式
1.xxxx × 2<sup>e</sup>)
例如整数 1 的科学计数法表示为 1.0 × 2⁰,符号位为 0,指数存储值为 1023(二进制 01111111111),尾数全 0,拼接后即为完整 64 位比特串。
能精确表示的整数范围
受限于 53 位有效精度,JavaScript 只能唯一、无歧义地表示所有满足以下条件的整数:
- 绝对值 ≤ 2⁵³ − 1(即
9007199254740991) Number.MAX_SAFE_INTEGER === 9007199254740991Number.MIN_SAFE_INTEGER === -9007199254740991- 超出该范围后,多个不同整数会映射到同一个
Number值,例如:9007199254740992 === 9007199254740993返回true
可用 Number.isSafeInteger() 检测数值是否处于安全范围内。
小数精度问题的根源
十进制小数如 0.1、0.2 在二进制中是无限循环小数(类似十进制中 1/3 = 0.333…),而双精度格式仅保留约 53 位有效二进制位,必须截断或舍入:
-
0.1 + 0.2 === 0.3返回false,实际结果为0.30000000000000004 - 只有形如
1/(2ⁿ)的有限二进制小数才能被精确表示,例如0.5、0.75、0.125 - 常见计算如
7.9 - 0.8、0.3 - 0.2同样可能产生微小偏差
极值与特殊值的存储逻辑
受 11 位指数域限制,Number 具有明确的上下界和特殊值表示:
- 最大正数:
Number.MAX_VALUE ≈ 1.7977e+308;超过则变为Infinity - 最小正非零数:
Number.MIN_VALUE ≈ 5e-324;低于此且非零会下溢为0 -
NaN、Infinity、-Infinity均由 IEEE 754 定义的特定比特模式表示,类型均为"number" - 所有这些值都共享同一套 64 位布局,没有额外类型标记或运行时区分
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











