gpt4 book ai didi

javascript - JS中的加法如何处理大数

转载 作者:行者123 更新时间:2023-11-29 18:57:42 29 4
gpt4 key购买 nike

在 discord 服务器上练习代码高尔夫时,我们发现一旦数字变大,我们的代码就会停止工作,结果会开始变得困惑。

主要计算是a=a*10+!(a%2),我们生成的系列中第一个会导致意外结果的a是a=1010101010101010 code>(预期:10101010101010101 与实际:10101010101010100)。

在调查时我发现计算10101010101010100 + 1 = 10101010101010100
看到之后,我尝试了 10101010101010100 + 2 = 10101010101010102 这让我很困惑。为什么加 1 会产生相同的值而加 2 则不会?

更多例子:

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

我也尝试将数字放在 Number() 中以防止任何自动转换(毕竟是 JS),但结果是一样的。

短暂延迟后What is JavaScript's highest integer value that a number can go to without losing precision?发布在 said discord 中,这似乎解释了为什么结果是这样的,但我很好奇控制台表面下发生的事情会产生这些相当出乎意料的结果。或者在 JS 中简单地定义了对大数字的算术运算行为是未定义的?

最佳答案

查看此 documentation .

它提到 JavaScript Number 的值用 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);

关于javascript - JS中的加法如何处理大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48571084/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com