为什么 Number("x") == BigInt("x") ... 只有在某些情况下成立?

10 浏览
0 Comments

为什么 Number("x") == BigInt("x") ... 只有在某些情况下成立?

我认为JavaScript的松散相等运算符对于比较数字和BigInts非常友好:

42 == 42n  // true!

所以我尝试了一个比Number.MAX_SAFE_INTEGER更大的数字。我觉得既然数字会自动四舍五入,我可能也需要将BigInt四舍五入以使它们被视为相等:

9999999999999999 == 10000000000000000   // true - 被四舍五入为float64
9999999999999999  == 9999999999999999n  // false - 合理!
10000000000000000 == 9999999999999999n  // false - 合理!
9999999999999999  == 10000000000000000n // true  - 合理!

太好了,很合理 - 所以我尝试了另一个四舍五入的大数字:

18446744073709551616 == 18446744073709552000   // true - 被四舍五入为float64
18446744073709551616 == 18446744073709551616n  // true?!
18446744073709552000 == 18446744073709551616n  // true?!
18446744073709551616 == 18446744073709552000n  // false?!

我在Chrome、Safari和Node.js中观察到了相同的结果。

为什么这种行为不一致呢?是因为这些数字是作为数学值进行比较的,这是什么意思呢?

bigint equality table

0