JavaScript中const变量赋值超大数字为何被舍入?溢出机制解析
数字被舍入的原因
JavaScript的Number类型基于IEEE 754双精度浮点数标准实现,用64位存储空间表示数值:1位符号位、11位指数位、52位尾数位(额外隐含1位最高位的1)。这种存储方式决定了它能精确表示的整数范围是-(2^53 - 1)到2^53 - 1,这个范围的上限就是9007199254740991(即Number.MAX_SAFE_INTEGER)。
你输入的90071992547419999992远超这个安全整数上限,JavaScript无法用64位浮点数精确存储它,只能自动将其近似为最接近的可表示浮点数,最终就出现了舍入后的结果90071992547420000000。
JavaScript的溢出处理机制
- 整数精度丢失:当整数超出
Number.MAX_SAFE_INTEGER或低于Number.MIN_SAFE_INTEGER时,相邻的多个整数会对应同一个浮点数表示,此时无法精确区分这些整数。比如9007199254740992和9007199254740993在JavaScript中会被存储为同一个值。 - 浮点数溢出/下溢:
- 当数值大到超过
Number.MAX_VALUE(约1.7976931348623157e+308)时,会被转换为Infinity(正无穷); - 当数值小到低于
Number.MIN_VALUE(约5e-324)时,会被转换为0。
- 当数值大到超过
- 大整数的精确处理方案:如果需要精确操作超出安全范围的大整数,可以使用JavaScript的
BigInt类型——在数字末尾加n,或者用BigInt()构造函数创建:const a = 90071992547419999992n; console.log(a); // 输出 90071992547419999992n console.log(typeof a); // 输出 bigint
内容的提问来源于stack exchange,提问作者Princy Ajit
相关产品推荐
相关产品推荐

