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

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

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

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

Какие-нибудь подводные камни, которых я должен избежать?

6 ответов

Решение

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

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

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

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

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

Просто используйте десятичную.

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

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

  • Умножьте на 100 / разделите на 100 (например, $100,25 -> 10025), чтобы получить представление в "центах"

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

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

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

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)

Вы можете:

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