JavaScript大数字算术运算结果出现错误的原因是什么?
根本原因
JavaScript 中所有数字默认都以 IEEE 754 双精度64位浮点数 格式存储,这种存储结构的特性决定了它无法精确表示超出安全整数范围的整数:
- 双精度浮点数的存储分为三部分:1位符号位、11位指数位、52位尾数位,用来表示整数的有效位只有53位(尾数的隐含最高位1加52位显式存储位)
- 可精确表示的整数范围为
-2^53 + 1到2^53 - 1,这个范围的边界也可以通过内置常量Number.MIN_SAFE_INTEGER和Number.MAX_SAFE_INTEGER直接获取,其中最大值为9007199254740991。
你用到的数值 35422484817926290 远大于 2^53,已经属于不安全整数:超出安全范围后,相邻两个可被精确存储的浮点数之间的间隔会大于1,你写的字面量在存入内存时就会被自动舍入到最接近的可表示浮点数,本身存储的就不是你预期的真实值,后续运算自然会出现误差。你可以直接执行console.log(35422484817926290)验证,输出结果和你写的字面量本身就不一致。
解决方案
如果需要处理超大整数的精确运算,可以使用ES2020引入的BigInt类型,只需要在数字字面量末尾加后缀n即可:
var num = 35422484817926290n console.log(num - 5n) // 输出 35422484817926285n,结果正确
内容的提问来源于stack exchange,提问作者Kristie
相关产品推荐
相关产品推荐

