加载笔记内容...
加载笔记内容...
现代计算机采用IEEE 754标准定义双精度浮点数(Double-precision floating-point format),其64位结构可拆解为:
1[S][Exponent][Mantissa]
21位 11位 52位
最大正数计算模型:
1(1 + (1 - 2^{-52})) × 2^{2046 - 1023} ≈ 1.7976931348623157e+308
最小正规格化数:
11.0 × 2^{-1022} ≈ 2.2250738585072014e-308
非规格化数(Denormalized numbers)扩展下限至:
12^{-1074} ≈ 5e-324
类型 | 指数域 | 尾数域 |
---|---|---|
零值 | 000...00 | 000...00 |
无穷大 | 111...11 | 000...00 |
NaN | 111...11 | 非零 |
JavaScript采用IEEE 754双精度标准存储所有数值类型,这种设计带来:
1console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
2console.log(Number.MIN_VALUE); // 5e-324
3console.log(Number.MAX_SAFE_INTEGER); // 2^53 - 1 = 9007199254740991
典型精度丢失案例:
10.1 + 0.2 === 0.3; // false
根本原因在于二进制分数循环:
10.1 (十进制) = 0.0001100110011... (二进制)
工程解决方案:
1function epsEqu(x, y) {
2 return Math.abs(x - y) < Number.EPSILON;
3}
当数值超过2^53 -1
时,建议:
1const bigInt = 9007199254740992n; // ES2020 BigInt类型
2console.log(bigInt + 1n); // 安全的大整数运算
1typeof NaN; // "number"
2Number.isNaN(NaN); // 正确检测方法
3Object.is(0, -0); // 区分±0
1数值系统
2├─ IEEE 754标准族
3│ ├─ 半精度浮点
4│ ├─ 单精度浮点
5│ └─ 扩展双精度
6├─ 定点数表示法
7├─ 符号-数值编码
8└─ 任意精度算法
实践建议:在开发金融系统时,推荐使用Money Pattern模式,将金额存储为最小货币单位的整数,例如以分存储人民币金额。
理解数值系统的底层实现,是构建可靠计算系统的基石。当我们处理关键业务逻辑时,应当像对待精密仪器般对待每一个数值操作。