首页 > 解决方案 > 为什么在使用 Python 计算时,Binet 公式的输出有小数?

问题描述

我正在用 Python 编写一个脚本,它返回斐波那契数列中的术语列表,给定一个开始术语和一个结束术语。例如,如果我输入“0”作为开始词,输入“6”作为结束词,那么输出应该是:

[0, 1, 1, 2, 3, 5, 8]

奇怪的是,当我运行程序时,输出是:

[0.0, 1.0, 1.0, 2.0, 3.0000000000000004, 5.000000000000001, 8.000000000000002]

为了计算序列的项,我使用了 Binet 的公式,我输入了((1 + math.sqrt(5))**x -(1 - math.sqrt(5))**x) / (2**x * math.sqrt(5))). 我在其他几个计算器中输入了相同的公式,看看他们是否会给我十进制的答案,但他们都没有。我是否以某种方式错误输入了公式,还是 Python 计算错误?

标签: pythonmathfibonacci

解决方案


由于存储问题,浮点数会丢失一些精度。有关详细信息,请参阅“浮点算术:问题和限制”

在这种简单的情况下,您可以round()再次使用来获取整数。但请注意:这也可能导致错误。

print([
    round(
        ((1 + math.sqrt(5))**x - (1 - math.sqrt(5))**x)
        / (2**x * math.sqrt(5))
    )
    for x in range(10)
])

结果是

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

推荐阅读