斐波那契任务.BigInt不同于数字



我正在做一项看似典型的面试任务——通过一个斐波那契数的索引来计算该数。但任务的困难在于,该指数可能高达2000000。我遇到了几个问题,我不明白为什么会发生这些问题。

首先是代码:

function fib(number) {  
const left = Math.pow((1 + Math.sqrt(5)) / 2, number);
const right = Math.pow((1 - Math.sqrt(5)) / 2, number);
const result = Math.round((left - right) / Math.sqrt(5));

console.log(result); // 
return BigInt(result); // 
}

问题:

  1. BigInt不同于数字
fib(96);
console.log(result) // -> 51680708854858490000
BigInt(result) // 51680708854858489856
  1. 错误答案。我认为这与之前的问题有关
fib(96);
// Must return 51680708854858323072
// But return BigInt 51680708854858489856

Javascript数字默认存储为浮点值,这意味着它们以科学记数法存储在内存中(除非您使用BigInt(,并且它们只能保持有限的精度。因此,一个大的数字有点像这样表示:1.2345 * 10^12,并且存储在存储器中的.之后的位数是有限制的。您正在处理一些非常大的数字,并且溢出了单个浮点数所能容纳的精度,这就是为什么您的计算最终会出错的原因。BigInt就是解决这个问题的方法,因为它不以科学记数法存储数字,并且可以容纳任意数量的数字。然而,你必须在计算过程中始终使用BigInt——你不能只是在最后将科学记数法数字转换为BigInt,然后期望额外的精度突然出现。

因此,为了使其正常工作,请确保将BigInt作为参数传递到fib函数中(或在传入后将其转换为一个(,并确保每个数字文字都是BigInt文字(例如,使用2n而不是2(。有一点需要注意——BigInt必须是整数,它不能包含十进制值。这可能需要对您的算法进行一些调整。

如果你想了解更多关于浮动的具体细节,以及它们可以保持多大的精度,可以看看维基百科的这篇文章。

最新更新