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

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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)

Вы можете:

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