Вопрос

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

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

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

Есть какие-нибудь подводные камни, которых мне следует избегать?

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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)

Ты можешь:

  • Внедряйте в свое приложение только то, что вам нужно.
  • Расширяйте его по мере роста.
  • Изменяйте внутреннее представление и реализацию по мере необходимости.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top