为何BigInt(18446744073709552000)返回值与输入数值不一致?
问题原因解析
核心问题出在JavaScript数字字面量的解析机制和Number类型的精度特性上:
当你调用
BigInt(18446744073709552000)时,括号内的18446744073709552000是十进制数字字面量。JavaScript引擎解析这个字面量时,会先将其转换为IEEE 754双精度浮点数(即Number类型)。由于该数值的十进制位数超过了Number能精确解析的有效范围,引擎会自动将其舍入到最接近的可精确表示的Number值——也就是18446744073709551616。因此BigInt接收的参数已经是被舍入后的数值,最终返回18446744073709551616n。而
Number('18446744073709552000')能得到正确结果,是因为字符串转Number的过程中,引擎可以精准识别该字符串对应的数值刚好是Number可精确表示的二进制浮点数,因此转换后保留了精确值。如果将这个精确的Number值传给BigInt,结果也是正确的:
const num = Number('18446744073709552000') BigInt(num) // 18446744073709552000n
- 要彻底避免这类问题,最可靠的方式是直接将字符串作为参数传给BigInt,跳过Number类型的转换环节:
BigInt('18446744073709552000') // 18446744073709552000n
内容的提问来源于stack exchange,提问作者everett1992
相关产品推荐
相关产品推荐

