Точность с умножением в десятичном модуле Python - PullRequest
0 голосов
/ 22 декабря 2019

Я использовал десятичный модуль Python для выполнения умножения и деления под впечатлением, что оно будет точным (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) было истинным.

1 Ответ

1 голос
/ 22 декабря 2019

Класс Decimal предназначен для представления десятичных чисел с фиксированным числом десятичных знаков. Это означает, что большинство дробей не будет представлено точно, поскольку они имеют бесконечные десятичные разложения;например, 1/3 = 0,333333333 ... будет округлено до конечного числа десятичных знаков как Decimal.

Если вам нужно точное представление рациональных чисел , чтобы умножениеи деление - истинные обратные величины, используйте модуль дроби :

>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...