Какой класс использовать для представления денег? - PullRequest
20 голосов
/ 10 сентября 2009

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

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

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

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

Ответы [ 6 ]

13 голосов
/ 24 июля 2012

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

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

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

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

11 голосов
/ 11 сентября 2009

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

7 голосов
/ 10 сентября 2009

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

4 голосов
/ 10 сентября 2009

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

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

  • Умножьте на 100 / Разделите на 100 (например, $ 100,25 -> 10025), чтобы получить представление в «центах»
4 голосов
/ 10 сентября 2009

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

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

1 голос
/ 30 июля 2013

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

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)

Вы можете:

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