在不和谐的服务器上练习代码高尔夫时,我们发现,一旦数字变大,我们的代码将停止工作,结果将开始变得混乱。
主要的计算是a=a*10+!(a%2)
,而我们生产的该系列中第一个产生意外结果的a是a=1010101010101010
(预期:10101010101010101
vs实际:)10101010101010100
。
在调查时我发现了计算结果10101010101010100 + 1 = 10101010101010100
。
看到那之后,我尝试10101010101010100 + 2 = 10101010101010102
使我感到困惑。为什么加1会得到相同的值,而加2却不会呢?
更多示例:
10101010101010100 + 3 = 10101010101010104
10101010101010102 + 1 = 10101010101010104
10101010101010104 + 1 = 10101010101010104
我还尝试输入数字Number()
以防止任何自动转换(毕竟是JS),但结果是相同的。
短暂延迟后,数字可以在不损失精度的情况下达到JavaScript的最大整数值是多少?张贴在不和谐状态中,这似乎可以解释为什么结果像原来一样,但是我很好奇控制台表面下会发生什么,这些结果出乎意料。还是对简单定义为JS中未定义的数字进行算术运算的行为?
请参阅本文档。
它提到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] 删除。
我来说两句