python - 为什么在使用 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 计算错误?
解决方案
由于存储问题,浮点数会丢失一些精度。有关详细信息,请参阅“浮点算术:问题和限制”。
在这种简单的情况下,您可以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]
推荐阅读
- php - PHP:CRUD 应用程序有更新/编辑问题
- typescript - 试图让 jest 与 typescript 一起工作,得到描述,毕竟,expect 是未定义的
- javascript - 在 JavaScript 中从数组中选择随机元素会返回整个数组
- c# - 在数据库中存储时区指示符
- python - 从文本文件中获取一行的前 n 个字符?
- django - Django CBV:get_queryset() 和 get_context_data()?
- sql - Presto查询:在地图中查找具有最大值的键
- capacitor - Capacitor: Uncaught (in promise) PushNotifications 没有网络实现
- python - Groupby 用于集群生成
- gcc - CMAKE:如何防止 CMAKE 构建项目不依赖的库?