期望 BigInt(9223372036854775807) === 9223372036854775807
实际上 BigInt(9223372036854775807) //9223372036854775808n
期望 BigInt(9223372036854775807) === 9223372036854775807
实际上 BigInt(9223372036854775807) //9223372036854775808n
这里出现了一个误解。你期望BigInt(9223372036854775807) === 9223372036854775807
,但是实际上,BigInt(9223372036854775807)
的结果是9223372036854775808n
,而不是9223372036854775807
。
原因在于,JavaScript 中 BigInt
类型用于表示比 Number
类型能表示的最大值更大的整数。Number
类型能安全表示的最大值是 2^53 - 1
,也就是 9007199254740991
,如果尝试超过这个值,就会导致精度问题。
而 BigInt
类型可以安全表示的最大值是 2^64 - 1
,也就是 18446744073709551615
,所以当你尝试将 9223372036854775807
(这个值小于 BigInt
的最大值)转换为 BigInt
类型,JavaScript 会返回 9223372036854775808n
。
因此,你的比较 BigInt(9223372036854775807) === 9223372036854775807
是不正确的,因为 BigInt(9223372036854775807)
的结果是 9223372036854775808n
。你应该改为比较 BigInt(9223372036854775807) === 9223372036854775808n
,这样才会返回 true
。
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
9223372036854775807 本身是一个 Number ,它自己就已经有误差了。也就是说,BigInt 构造看到的数就已经是 9223372036854775808 了。
可以使用 BigInt("9223372036854775807") ,就不会丢失精度了