首页 > 解决方案 > JavaScript: Number.MAX_SAFE_INTEGER 实际上不是安全整数吗?

问题描述

在对 HackerRank 执行一些位操作的任务时,我注意到了一件奇怪的事情:尽管任务中的数字限制为 10 ** 15(大约比 小 9 倍Number.MAX_SAFE_INTEGER),但如果不使用,一些测试用例会失败BigInt——尽管此类操作的源编号和产品编号均不超过最大安全整数。然后,我在浏览器控制台中手动尝试了以下操作,结果如下(这真的让我感到惊讶):

507199254740991 >> 1 // -1011589121 (wrong, although 507199254740991 is about 18 times less than max safe integer)
Number(507199254740991n >> 1n) // 253599627370495 (correct)
Math.floor(507199254740991 / 2) //253599627370495 (correct)

638621066001121 ^ 907368627742749 // -1250667780 (wrong)
Number(638621066001121n ^ 907368627742749n) // 419934881731324 (correct)

为什么会发生?Number.MAX_SAFE_INTEGER 实际上不是安全整数吗?它仍然是,那么为什么一些数字在这个范围内的操作会失败?这是 JavaScript 的错误还是我遗漏了什么?

标签: javascriptnumbers

解决方案


二元运算符(>>以及^其他运算符)首先将数字操作数转换为 32 位整数,然后基于它执行操作。


推荐阅读