如何避免 "Infinity" 和 console.log 在 Javascript 中出现大数?

How to avoid "Infinity" and console.log a large number in Javascript?

我试图找到斐波那契数列中包含超过 1000 位数字的第一个数字。

给定一个数字 n(例如 4),我找到了一种方法来查找第一个 n 位数字在斐波那契数列中的位置,以及一种方法来查找给定其在序列中的位置的数字。

比如说,您需要知道斐波那契数列中第一个 4 位数字及其在数列中的位置。我的代码会像这样工作:

var phi = (1+Math.sqrt(5))/2;
var nDigits = 4;


var fEntry = Math.ceil(2 + Math.log(Math.pow(10, nDigits- 
1))/Math.log(phi)); 
var fNumber = 2 * Math.pow(phi, fEntry);

console.log(fEntry);
console.log(fNumber);

在控制台中,您会看到 fEntry(即数字在斐波那契数列中的位置)和 fNumber(您要查找的数字)。例如,如果你想找到第一个 4 位数字及其在序列中的位置,你将在第 17 位得到数字 1597,这是正确的。

到目前为止一切顺利。

当我想找到大数字时就会出现问题。我需要在斐波那契数列中找到第一个有 1000 位数字的数字,但是当我编写 nDigits = 1000 和 运行 代码时,控制台会为 fEntry 和 fNumber 显示 "Infinity"。我想原因是我的代码涉及的计算数字高于 Javascript 可以处理的数字。

如何找到该数字并避免无穷大?

How can I find that number and avoid Infinity?

您不能使用 number 类型。尽管它可以容纳大量值,但在 Number.MAX_SAFE_INTEGER (9,007,199,254,740,991) 之后它会失去整数精度:

const a = Number.MAX_SAFE_INTEGER;
console.log(a);     // 9007199254740991
console.log(a + 1); // 9007199254740992, so far so good
console.log(a + 2); // 9007199254740992, oh dear...

您可以在支持它的平台上使用新的 BigInt。或者,几个 "big int" 库中的任何一个将数字存储为数字字符串(字面意思)。