Разъяснение о типе Decimal в Python

Все знают, или, по крайней мере,каждый программист должен знать, что с помощьюfloat Тип может привести к ошибкам точности. Тем не менее, в некоторых случаях точное решение будет отличным, и в некоторых случаях сравнение с использованием значения эпсилона недостаточно. Во всяком случае, это не совсем так.

Я знал оDecimal введите Python, но никогда не пытался его использовать. Это заявляет, что«Десятичные числа могут быть представлены точно» и я подумал, что это означает умную реализацию, которая позволяет представлять любое действительное число. Моя первая попытка была:

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

Совершенно разочарованный, я вернулся к документации и продолжал читать:

Контекстом для арифметики является среда, определяющая точность [...]

Хорошо, так что на самом деле есть точность. И классические проблемы могут быть воспроизведены:

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

Так,мой вопрос: Есть ли способ иметь десятичный тип с бесконечной точностью? Если нет, то каков более элегантный способ сравнения 2 десятичных чисел (например, d3 <1 должно возвращать False, если дельта меньше точности).

В настоящее время, когда я делаю только деления и умножения, я используюFraction тип:

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

Это лучший подход? Какие могут быть другие варианты?

Ответы на вопрос(4)

Ваш ответ на вопрос