我使用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)为真的代码。
答案 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。您应该避免将此十进制模块应用于整数和分数。