JS中的加法如何处理大数

ghostfart007

在不和谐的服务器上练习代码高尔夫时,我们发现,一旦数字变大,我们的代码将停止工作,结果将开始变得混乱。

主要的计算是a=a*10+!(a%2),而我们生产的该系列中第一个产生意外结果的a是a=1010101010101010(预期:10101010101010101vs实际:)10101010101010100

在调查时我发现了计算结果10101010101010100 + 1 = 10101010101010100
看到那之后,我尝试10101010101010100 + 2 = 10101010101010102使我感到困惑。为什么加1会得到相同的值,而加2却不会呢?

更多示例:

10101010101010100 + 3 = 10101010101010104
10101010101010102 + 1 = 10101010101010104
10101010101010104 + 1 = 10101010101010104

我还尝试输入数字Number()以防止任何自动转换(毕竟是JS),但结果是相同的。

短暂延迟后,数字可以在不损失精度的情况下达到JavaScript的最大整数值是多少?张贴在不和谐状态中,这似乎可以解释为什么结果像原来一样,但是我很好奇控制台表面下会发生什么,这些结果出乎意料。还是对简单定义为JS中未定义的数字进行算术运算的行为?

Xeraqu

请参阅本文档

它提到JavaScript数字的值用52位表示。随着您的数字越来越接近超过该位数,可以表示给定范围内越来越少的数字。

对于之间的数字Math.pow(2, 52)Math.pow(2, 53),每个整数可表示。即:

Math.pow(2, 52) === Math.pow(2, 52) + 0.5

对于介于Math.pow(2, 53)之间Math.pow(2, 54)(即所在位置10101010101010100)的数字,可以表示第二个整数,然后是每个第四个整数,依此类推,随着范围功率的增加。

console.log('2^52 === 2^52 + 0.5 :', 
  Math.pow(2, 52) === Math.pow(2, 52) + 0.5);
  
console.log('2^53 === 2^53 + 1   :', 
  Math.pow(2, 53) === Math.pow(2, 53) + 1);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章