Python的Decimal模块中的乘法精度

时间:2019-12-22 06:07:37

标签: python precision

我使用Python的Decimal模块执行乘法和除法,这给人的印象是准确的(a / b * b应该返回a)。但是,事实并非如此。

from decimal import *
getcontext().prec = 50

dec1 = Decimal("703")
dec2 = Decimal("3499")
dec3 = dec1/dec2

print(dec3*dec2)

if dec1==dec3*dec2:
    print(True)
else:
    print(False)

我得到的输出是

702.99999999999999999999999999999999999999999999999
False

我的问题是,是否有任何模块或功能可以使此过程更加精确?我有要求此关系(a / b * b == a)为真的代码。

3 个答案:

答案 0 :(得分:1)

Decimal类用于表示具有固定小数位数的十进制数字。这意味着大多数分数都无法精确表示,因为它们具有无限的十进制扩展。例如,1/3 = 0.333333333 ...将四舍五入为Decimal的小数位数。

如果您需要精确表示rational numbers,以使乘法和除法为真逆,请使用fractions模块:

>>> from fractions import Fraction
>>> a = Fraction(703)
>>> b = Fraction(3499)
>>> c = a / b
>>> print(c)
703/3499
>>> print(c * b)
703
>>> a == c * b
True
>>> d = Fraction(1, 3)
>>> d * 3 == 1
True

答案 1 :(得分:1)

使用实数时,始终建议不要使用==。除法得到一个具有固定内存的实数(因语言而异),因此除法总是四舍五入。从而使乘法给出近似答案。

相反,您可以使用

def check_equals(a, b, threshold=1e-6):
    if abs(a-b)<threshold:
        return True
    return False

您可以根据自己的喜好更改阈值。

答案 2 :(得分:0)

考虑对整数不使用该十进制模块。根据文档,十进制模块保留有效数字,包括零:https://docs.python.org/3/library/decimal.html。您应该避免将此十进制模块应用于整数和分数。