javascript - 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 的错误还是我遗漏了什么?
解决方案
二元运算符(>>
以及^
其他运算符)首先将数字操作数转换为 32 位整数,然后基于它执行操作。
推荐阅读
- lldb - Hopper Disassembler v4,无法启动调试器。未找到 LLDB
- npm-install - 安装和使用“npm”的示例
- python - 无头浏览器无法在页面之间导航
- python - 如何用枕头调整图像大小?
- javascript - 如何使用 outerHTML 结果从 html 中查找元素?
- android - MotionLayout 不会使用 MotionScene 进行动画处理
- c++ -
: 没有这样的文件或目录 Windows 10 - c# - 使用 Acumatica REST API 发送电子邮件
- django - Django:未强制执行 UniqueConstraint
- autocomplete - 强制 Qt Creator 解析和索引 -inl.h 文件