首页 > 解决方案 > JavaScript 的整数加法问题

问题描述

我们目前正在实验室学习 JavaScript,我们刚刚创建了一个简单的 Fibonacci 函数来计算 Fibonacci 序列的前 100 个数字。

function fibo(stop) {
  let counter = 0;
  let first = 1;
  let second = 1;
  let third = 0;
  console.log(third);
  console.log(second);
  console.log(first);
  while (true) {
    third = second;
    second = first;
    first = second + third;
    counter++;
    if (counter >= stop) {
      break;
    }
    console.log(first);
  }
}

fibo(100);

现在,当我运行它时,有一个部分只是神奇地将数字加在一起是错误的。

控制台截图

当我在 JavaScript 中分别将这两个数字相加时,我得到的答案与屏幕截图中的第三行相同。但是,当我在计算器上重做添加时,它显示14 472 334 024 676 221而不是14 472 334 024 676 220. 我的第一个猜测是它与整数溢出有关,但又是 log2(14472334024676220) = 53.684... 这意味着在 64 位整数中它没有溢出。为什么会这样?它从何而来?我试着问我的老师,但他不知道。

标签: javascriptintegerfibonacci

解决方案


处理整数时,最大安全整数(即 n + 1 !== n)9007199254740991是 2^53 - 1

Javsacript 数字是 64 位浮点数,这并不意味着整数

使用 BigInts - 初始化一个 BigInt 你可以使用n如下数字的后缀

function fibo(stop) {
  let counter = 0;
  let first = 1n;
  let second = 1n;
  let third = 0n;
  console.log(third.toString());
  console.log(second.toString());
  console.log(first.toString());
  while (true) {
    third = second;
    second = first;
    first = second + third;
    counter++;
    if (counter >= stop) {
      break;
    }
    console.log(first.toString());
  }
}

fibo(100);

注意: Stack Snippet console.log 无法记录 BigInt 这就是我将.toString()


推荐阅读