javascript所有数字基于ieee 754双精度浮点格式,导致0.1+0.2≠0.3;可精确表示整数上限为2⁵³−1;小数因二进制无限循环被截断产生误差;支持非规格化数和infinity/nan等特殊值。

JavaScript 所有数字都基于 IEEE 754 双精度(64 位)浮点格式,没有整数类型或任意精度数——这直接决定了它能精确表示什么、不能表示什么,以及为什么会出现 0.1 + 0.2 !== 0.3 这类现象。
64 位结构决定精度上限
一个 double 型数在内存中拆为三部分:
- 1 位符号位(S):决定正负
- 11 位指数域(E):实际指数 = E − 1023,范围是 −1022 到 +1023(全 0 和全 1 为特殊值)
- 52 位尾数域(F):隐含前导 1,即真实尾数 M = 1.F₂,共 53 位有效二进制位
这意味着:能**精确表示的十进制整数**,仅限于绝对值 ≤ 2⁵³ − 1(即 9,007,199,254,740,991)的整数。超过这个值,相邻可表示数的间隔 ≥ 2,必然跳过某些整数。
无法精确存储的十进制小数
很多有限位十进制小数,在二进制中是无限循环小数。例如:
- 0.1₁₀ = 0.00011001100110011…₂(循环节 0011)
- 0.2₁₀ = 0.0011001100110011…₂
它们必须被截断到 52 位尾数,造成约 ±2⁻⁵³ 的相对误差。两个近似值相加后,结果仍是一个近似值,自然不等于精确的 0.3。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
规格化与非规格化数影响极小值范围
IEEE 754 支持两种数值形式:
- 规格化数:E ∈ [1, 2046],M = 1.F,最小正数为 2⁻¹⁰²² ≈ 2.2 × 10⁻³⁰⁸
- 非规格化数:E = 0,M = 0.F(无隐含 1),用于填补 0 到规格化下限之间的空隙,最小正数为 2⁻⁵² × 2⁻¹⁰²² = 2⁻¹⁰⁷⁴ ≈ 4.9 × 10⁻³²⁴
JavaScript 支持非规格化数(如 5e-324 是合法值),但运算性能较低;一旦结果小于此范围,就下溢为 0。
特殊值和边界行为
JavaScript 完全遵循 IEEE 754 对特殊状态的定义:
- E 全为 1 且 F = 0 →
Infinity或-Infinity(如1 / 0) - E 全为 1 且 F ≠ 0 →
NaN(如0 / 0、Math.sqrt(-1)) - E 全为 0 且 F = 0 → ±0(
-0存在且与0相等但可区分,如1 / -0 === -Infinity)
这些不是 JavaScript 的“bug”,而是标准规定的语义;比如 NaN !== NaN 就源于 IEEE 754 明确要求:任何涉及 NaN 的比较都返回 false。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










