相关疑难解决方法(0)

处理大数字时的中点“舍入”?

所以我试图理解 JavaScript 在处理大数时的行为。考虑以下(在 Firefox 和 Chrome 中测试):

console.log(9007199254740993) // 9007199254740992
console.log(9007199254740994) // 9007199254740994
console.log(9007199254740995) // 9007199254740996
console.log(9007199254740996) // 9007199254740996
console.log(9007199254740997) // 9007199254740996
console.log(9007199254740998) // 9007199254740998
console.log(9007199254740999) // 9007199254741000
Run Code Online (Sandbox Code Playgroud)

现在,我知道为什么它会输出“错误”的数字——它试图将它们转换为浮点表示,并四舍五入到最接近的可能浮点值——但我不完全确定它为什么选择这些特定的数字。我的猜测是它试图四舍五入到最接近的“偶数”数,因为 9007199254740996 可以被 4 整除而 9007199254740994 不是,它认为 9007199254740996 更“偶数”。

  • 它使用什么算法来确定内部表示?我的猜测是它是常规中点舍入的扩展(舍入到偶数是 IEEE 754 函数中的默认舍入模式)。
  • 这种行为是作为 ECMAScript 标准的一部分指定的,还是依赖于实现?

javascript floating-point floating-point-precision floating-point-conversion

4
推荐指数
1
解决办法
453
查看次数