python-3.x - 为什么我在 python 中使用 while lopp 在每个步骤中添加 0.050 时得到 x=0.15000000000000002
问题描述
我运行下面的python代码,
x=0
while x<1:
x+=0.050
print(x)
并得到以下结果。我不明白。
0.05 0.1 0.15000000000000002 0.2 0.25 0.3 0.35 0.39999999999999997 0.44999999999999996 0.49999999999999994 0.5499999999999999 0.6 0.65 0.7000000000000001 0.7500000000000001 0.8000000000000002 0.8500000000000002 0.9000000000000002 0.9500000000000003 1.0000000000000002
解决方案
您正在进行浮点计算,我认为这是您第一次看到浮点错误。此错误不取决于 Python,而是取决于计算机中实数的底层实现:不幸的是,许多实数无法在机器内部完美表示,因为内存只能处理有限数量的数字,因此它会截断数字,有效地犯了错误。
“但 0.05 没有无限位数”,你会说。如果计算机以 10 为基数工作,这将是正确的,但它们使用以 2 为基数的二进制数,因此以 10 为基数的有限位表示可能具有二进制的周期性表示。
为了您的程序,您不妨降低打印数字的精度,因为在您的问题范围内错误不会很明显(错误不会累积那么多),这样:
print("{.3f}".format(x))
我建议在 Google 上查找并访问其他评论中的链接,这是一个非常有趣的话题。
因为你在做这种计算时会出错,所以float
在做重要的事情时绝对避免使用类型,比如货币可控制性!您应该改用任意精度类型,例如Decimal。
推荐阅读
- javascript - 如何在 VueJS + Vuex 中处理多个 websocket 端点?
- python - 数据转换/映射的最佳方法
- node.js - 如何将ss的pid信息传递给kill
- python - 在 Keras 中显示内核内容的方法
- javascript - 如何从我的控制器发送 json 数据以查看?
- java - 如何找出特定端点是否在 Spring Boot 中启用了 keepalive?
- linux - 我可以在安装期间或之后通过命令行为基于 linux 的 Pycharm 分配 python 解释器吗?
- ios - 使用 WatchConnectivity 框架的独立手表应用
- android - SoftInput.AdjustResize 导致键盘在显示或隐藏时闪烁
- android - 观察对象类中的实时数据