首页 > 解决方案 > Python 对算术计算给出了错误的答案

问题描述

a = 1000000000
b = 1000000    
max_ = int((a - b + 1) * (a - b) / 2)

我的代码中有这一行,当“ a ”等于十亿(1000000000)和“ b ”等于一百万(1000000)时,结果得出了答案“499000500499500032”。这个算术计算的正确结果是"499000500499500000"

我搜索了它为什么这样做,但找不到任何东西。如果在这种情况下很重要,我正在使用Python 3.9.5 。

标签: pythonpython-3.x

解决方案


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

这样看起来更好!但是,仍然缺乏精确度,具体取决于您要划分的内容。


推荐阅读