Разъяснение о типе 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
Это лучший подход? Какие могут быть другие варианты?