【问题标题】:How to avoid "Infinity" and console.log a large number in Javascript?如何在Javascript中避免“Infinity”和console.log大量?
【发布时间】:2019-04-05 14:34:21
【问题描述】:

我试图找到斐波那契数列中包含超过 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 可以处理的数字。

我怎样才能找到那个数字并避免 Infinity?

【问题讨论】:

    标签: javascript math fibonacci infinity


    【解决方案1】:

    我怎样才能找到那个数字并避免无穷大?

    你不能,使用 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。或者,将数字存储为数字字符串(字面意思)的几个“大整数”库中的任何一个。

    【讨论】:

    • 感谢您的回答。我做了一些研究,如果我理解正确,如果我使用 BigInt 或您提到的库,我将无法执行大于 Number.MAX_SAFE_INTEGER 的操作。您认为我有什么方法可以执行所需的大型 math.pow 以便在斐波那契数列中找到第一个具有 1000 位数字的数字?如果有,怎么做?
    • @tommsyeah - 是的,您可以:(9007199254740991n + 9007199254740991n + 9007199254740991n + 9007199254740991n) * 10000000000n360287970189639640000000000n。 BigInt 除了内存没有范围限制,基本操作都有。确实它没有sqrt,一些功能need to be implemented(至少现在是这样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多