fogersp
@fogersp

Python Decimal и хранение денег в базе?

Добрый день.

Такой вопрос: есть уже давно работающий биллинг пользователей. Нужно написать API для него на Python + Django и Django Rest Framework.
Столкнулся с проблемой: часто в базе попадаются значения баланса такие как 0.00000556173504051571 или 0.0000100497431776564. Нормальные значения, но Питон их выводит как 5.56173504051571e-06 и 1.00497431776564e-05 соответственно. С экспонентой. В общем, я знаю что в Питоне денежки надо хранить не в Float, а в Decimal. Соответственно в сериалайзере в DRF я использовал
balance = serializers.DecimalField(decimal_places=35, max_digits=40, default=0)

Вообще, в основном в базе у значений баланса 18 знаков после запятой. Но, есть значения и с 30-ю знаками. Взял с запасом 35.
В итоге, я могу вывести значение 5.56173504051571e-06 как 0.00000556173504051571000000000000000, а 1.00497431776564e-05 как 0.00001004974317765640000000000000000. И например если баланс в базе = 0, у меня будет 0.00000000000000000000000000000000000. Может есть какое решение для этого? Я пробовал rstrip, но для этого надо перевести в string значение, а там уже опять получается отображение с экспонентой

У меня два вопроса:

1. Можно ли все таки использовать float для денег? Все таки ЯП биллинга пишет баланс в базу во float. Если да, то как в Float убрать отображение экспоненты? Можно форматирование строки сделать, но тут опять же надо указать количество знаков после запятой и будет разница с исходным значением в базе.
2. Нормально если использовать Decimal для денег такое хранение с нулями в конце в базе? Не будет ли проблем из-за этого? Например, что биллинг будет писать из другого ЯП в float, а я с API в Decimal. Опасно как-то мне кажется.
  • Вопрос задан
  • 1824 просмотра
Пригласить эксперта
Ответы на вопрос 1
igorzakhar
@igorzakhar
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы