为什么JavaScript会自动对超大整数执行近似取值操作?
JavaScript 超大整数自动近似的底层原因
核心原因是 JavaScript 的数字类型采用了 IEEE 754 双精度浮点数编码规范:
- JavaScript 中没有独立的整数类型,所有数值默认都是
Number类型,统一用64位双精度浮点数存储。该存储结构分为三部分:1位符号位(标识正负)、11位指数位(存储幂次)、52位尾数位(存储有效数字)。 - 双精度浮点数能精确表示的整数范围为 -2^53 到 2^53(即
-9007199254740992~9007199254740992),该区间也被称为安全整数范围,可通过内置常量Number.MIN_SAFE_INTEGER和Number.MAX_SAFE_INTEGER直接获取边界值。 - 你示例中的
9223372036854775807是2的63次方减1,远大于2^53,已经超出安全整数范围:52位尾数位不足以存储该整数的全部有效二进制位,会自动按照浮点数的就近舍入规则做近似存储,最终读取时就会得到近似值9223372036854776000。
如果需要精确处理超大整数,可以使用 ES2020 引入的原生BigInt类型,只需在整数末尾加后缀n即可声明,比如9223372036854775807n就能完整保留精度。
内容的提问来源于stack exchange,提问作者Agodzilla
相关产品推荐
相关产品推荐

