Esclarecimento sobre o tipo decimal em Python

Todo mundo sabe, ou pelo menos,todos os programadores devem saber, que usando ofloat O tipo pode levar a erros de precisão. No entanto, em alguns casos, uma solução exata seria ótima e há casos em que a comparação usando um valor epsilon não é suficiente. Enfim, esse não é realmente o ponto.

Eu sabia sobre oDecimal digite Python, mas nunca tentei usá-lo. Afirma que"Números decimais podem ser representados exatamente" e eu pensei que isso significava uma implementação inteligente que permite representar qualquer número real. Minha primeira tentativa foi:

>>> from decimal import Decimal
>>> d = Decimal(1) / Decimal(3)
>>> d3 = d * Decimal(3)
>>> d3 < Decimal(1)
True

Muito decepcionado, voltei à documentação e continuei lendo:

O contexto da aritmética é um ambiente que especifica precisão [...]

Ok, então existe realmente uma precisão. E os problemas clássicos podem ser reproduzidos:

>>> dd = d * 10**20
>>> dd
Decimal('33333333333333333333.33333333')
>>> for i in range(10000):
...    dd += 1 / Decimal(10**10)
>>> dd
Decimal('33333333333333333333.33333333')

Assim,minha pergunta é: existe uma maneira de ter um tipo decimal com uma precisão infinita? Caso contrário, qual é a maneira mais elegante de comparar 2 números decimais (por exemplo, d3 <1 deve retornar False se o delta for menor que a precisão).

Atualmente, quando faço apenas divisões e multiplicações, uso oFraction tipo:

>>> from fractions import Fraction
>>> f = Fraction(1) / Fraction(3)
>>> f
Fraction(1, 3)
>>> f * 3 < 1
False
>>> f * 3 == 1
True

É a melhor abordagem? Quais poderiam ser as outras opções?

questionAnswers(4)

yourAnswerToTheQuestion