Какой класс использовать для представления денег?

Какой класс следует использовать для представления денег, чтобы избежать большинства ошибок округления?

Должен ли я использовать Decimal или простой встроенный number?

Существует ли какой-либо существующий класс Money с поддержкой преобразования валюты, который я мог бы использовать?

Любые ошибки, которых я должен избегать?

6 ответов

Я предполагаю, что вы говорите о Python. http://code.google.com/p/python-money/ "Примитивы для работы с деньгами и валютами в Python" - название самоочевидно:)


Никогда не используйте число с плавающей запятой, чтобы представлять деньги. Плавающие числа не представляют цифры в десятичных обозначениях точно. Вы закончите с кошмаром сложных ошибок округления и не сможете надежно конвертировать между валютами. См. короткое эссе Мартина Фаулера по этому вопросу.

Если вы решили написать свой собственный класс, я рекомендую использовать его в типе decimal.

Я не думаю, что python-money - хороший вариант, потому что он не поддерживался в течение довольно долгого времени, а его исходный код имеет какой-то странный и бесполезный код, и обмен валюты просто сломан.

Попробуйте py-moneyed. Это улучшение по сравнению с деньгами python.


Просто используйте decimal.


Вам может быть интересно QuantLib для работы с финансами.

Он построил классы для обработки типов валют и претензий на 4 года активного развития.


Вы могли бы посмотреть на эту библиотеку: python-money. Поскольку у меня нет опыта с этим, я не могу прокомментировать его полезность.

"Трюк", который вы могли бы использовать для обработки валюты в виде целых чисел:

  • Умножить на 100/Разделить на 100 (например, $100,25 → 10025), чтобы иметь представление в 'cents'


Простая, легкая, но расширяемая идея:

class Money():
 def __init__(self, value):
 # internally use Decimal or cents as long
 self._cents = long(0)
 # Now parse 'value' as needed e.g. locale-specific user-entered string, cents, Money, etc.
 # Decimal helps in conversion
 def as_my_app_specific_protocol(self):
 # some application-specific representation
 def __str__(self):
 # user-friendly form, locale specific if needed
 # rich comparison and basic arithmetics
 def __lt__(self, other):
 return self._cents < Money(other)._cents
 def __add__(self, other):
 return Money(self._cents + Money(other)._cents)

Вы можете:

  • Реализуйте только то, что вам нужно в вашем приложении.
  • Расширьте его, пока вы растете.
  • При необходимости измените внутреннее представление и реализацию.

licensed under cc by-sa 3.0 with attribution.