Какой класс использовать для представления денег?
-
05-07-2019 - |
Вопрос
Какой класс я должен использовать для представления денег, чтобы избежать большинства ошибок округления?
Должен ли я использовать 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)
Ты можешь:
- Внедряйте в свое приложение только то, что вам нужно.
- Расширяйте его по мере роста.
- Изменяйте внутреннее представление и реализацию по мере необходимости.