python - Python 对算术计算给出了错误的答案
问题描述
a = 1000000000
b = 1000000
max_ = int((a - b + 1) * (a - b) / 2)
我的代码中有这一行,当“ a ”等于十亿(1000000000)和“ b ”等于一百万(1000000)时,结果得出了答案“499000500499500032”。这个算术计算的正确结果是"499000500499500000"。
我搜索了它为什么这样做,但找不到任何东西。如果在这种情况下很重要,我正在使用Python 3.9.5 。
解决方案
Python 使用 CPU 的本机浮点数,它是对真实浮点数的二进制估计。它本身不是 python 的问题,它在固定长度的二进制浮点数中固有的不精确性。只需将您想要的值写为浮点数即可说明问题:
>>> f"{499000500499500000.:f}"
'499000500499500032.000000
如果您需要比float
报价更高的精度,该decimal
模块可能适合您。
>>> from decimal import Decimal
>>> a = Decimal(1000000000)
>>> b = Decimal(1000000)
>>> max_d = (a - b + 1) * (a - b) / 2
>>> max_d
Decimal('499000500499500000')
>>> max_ = int(max_d)
>>> max_
499000500499500000
float
存在,即使它是对真实实数的估计,因为这种精度的缺乏通常可以考虑到算法中。当这个错误太多时,或者当你在做会计之类的错误很严重的事情时,还有另一种选择decimal
。
请参阅浮点算术:问题和限制
另一种选择是使用不通过的楼层划分float
。
>>> a = 1000000000
>>> b = 1000000
>>> (a - b + 1) * (a - b) // 2
499000500499500000
这样看起来更好!但是,仍然缺乏精确度,具体取决于您要划分的内容。
推荐阅读
- python - 访问 OptionMenu 项目 - Tkinter
- php - 如何从 PHP 循环订购打印数据?
- uwp - 为什么我的事件处理程序被认为没有引用?
- javascript - javascript没有输出
- swiftui-list - NavigationLink:显示带有调查的中间视图,并在关闭后 - 继续“目标”视图
- python - 为什么这个素数算法对 323 失败?
- javascript - Web编程中的fetch(js中的函数)和socket io有什么区别
- svn - 通过系统命令行检查 SVN 文件夹外部
- android - 记住不要再问可以吗?
- ruby-on-rails - 在 docker 上找不到工头