Re 1, это на самом деле поведение мы разработали - правильно или неправильно, как это может быть (извините, если что экскурсии ваш случай использования, но мы пытались быть вообще!).
В частности, в любом случае каждый объект Python может быть подвержен неравенству по сравнению с любым другим - объекты типов, которые на самом деле не сопоставимы, произвольно сравниваются (последовательно в данном пробеге, а не во всех прогонах) ; основной вариант использования - сортировка гетерогенного списка для группировки элементов в нем по типу.
Исключение было введено только для сложных чисел, что делало их несопоставимыми ни с чем, но это было еще много лет назад, когда мы были иногда кавалерами, нарушая превосходный код пользователя. В настоящее время мы гораздо более строгие в отношении обратной совместимости в рамках основного выпуска (например,вдоль 2.*
линии, так и отдельно по 3.*
один, хотя Несовместимость являются разрешены между 2 и 3 - на самом деле это целая точка имея серию 3.*
, позволяя нам исправить прошлые проектные решения даже в несовместимых способов).
Произвольные сравнения оказались более трудными, чем они того стоят, вызывая путаницу пользователя; и группировка по типу теперь может быть легко получена, например, с аргументом key=lambda x: str(type(x))
до sort
; поэтому в Python 3 сравнения между объектами различных типов, если сами объекты специально не позволяют ей в методах сравнения, не вызывает исключение:
>>> decimal.Decimal('2.0') > 1.2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: Decimal() > float()
Другими словами, в Python 3 это ведет себя точно так, как вы думаете, что должен ; но в Python 2 это не (и никогда не будет в любом Python 2.*
).
Re 2, вы будете в порядке - хотя посмотрите на gmpy, поскольку я надеюсь, что это интересный способ конвертировать удвоения в бесконечные прецизионные дроби через Farey. Если цены, которые вы имеете дело с четками не более чем центы, используйте '%.2f' % x
, а не repr(x)
! -)
Вместо подкласса Decimal, я хотел бы использовать функцию фабрики, такие как
def to_decimal(float_price):
return decimal.Decimal('%.2f' % float_price)
, поскольку полученный после этого десятичный результат является совершенно обычным.
Этот ответ немного устарел: 'decimal.Decimal' и' float' численно сопоставимы в 2.7. «Изменено в версии 2.7: сравнение между экземпляром float x и экземпляром Decimal y теперь возвращает результат, основанный на значениях x и y. В более ранних версиях x