为什么"Double"数据类型会弄乱我的斐波那契数列?



我正在尝试编写一个程序,它为我提供了斐波那契数列中第一个 1000 位数字的索引。我将数据类型设置为"Double",因为我需要存储长数字,但是我得到的输出不正确?

我尝试将"num"数据类型设置为"整数"、"long"甚至"int64",但所有这些都会在大约 2 秒后给我一个溢出错误。

Dim num, prev, temp, index As Double
Sub Main()
num = 1
prev = 1
temp = 1
index = 1
While Len(num) < 1000
Console.WriteLine(num)
temp = num
num += prev
prev = temp
index += 1
End While
Console.WriteLine(index) 
Console.ReadLine()
End Sub

我希望程序输出斐波那契数列,直到找到第一个 1000 位数字,然后它将输出它的索引。但是,我只得到十进制数字负载的输出(大约 20 个小数点),然后输出 8。永远。

我真的被难住了。有什么想法吗?

double数据类型的精度不允许存储这么多数字。

如果使用BigInteger则可以存储尽可能多的数字,因为数据类型会根据需要增加其存储。

此外,正如评论所建议的那样,在 1000 位数字后停止的一种快速而肮脏的方法是将数字转换为字符串并检查其长度。这样,您就不会使用会导致溢出的数学运算。

代码应如下所示:

Dim num, prev, temp, index As BigInteger
Sub Main()
num = 1
prev = 1
temp = 1
index = 1
While BigInteger.Log10(num) <= 999
Console.WriteLine(num)
temp = num
num += prev
prev = temp
index += 1
End While
Console.WriteLine(index) 
Console.ReadLine()
End Sub

这一切都归结为vb中没有数据类型能够容纳1000位数字。如果我是你,我会有一个包含 1000 个项目的数组,每个项目都是一个数字。