Я пишу приложение web2py, которое требует суммирования в долларах без потери точности.Я понимаю, что для этого мне нужно использовать десятичные дроби, но я обнаружил, что должен обернуть каждое число, полученное из базы данных:
Decimal(str(myval))
Прежде чем сойти с ума, добавив, чтоко всему моему коду, есть ли лучший способ?Я новичок в Python, поэтому вполне возможно, что я пропускаю что-то очевидное.
Редактировать : моя база данных - MS SQL Server, и я храню суммы в SQL Server money
поля (я считаю, что реализация аналогична десятичной, то есть целочисленная математика, а не с плавающей запятой).
Я подключаюсь к БД через каркас web2py (который использует pyodbc
для соединений с SQL Server).Я считаю, что web2py имеет некоторую поддержку десятичных типов.Например, мои определения полей web2py выглядят так: Field('Amount','decimal(19,4)')
Однако, когда я возвращаю значение из базы данных, используя метод .executesql
web2py, он возвращает значение как float
, а не Decimal
.
Редактировать : Это похоже на проблему с FreeTDS и MS SQL Server.Как сказал Массимо в комментариях, web2py правильно поддерживает это и возвращает десятичное число (если может).Оказывается, это только проблема в моей производственной среде (Linux).Я использую драйвер FreeTDS для подключения к MS SQL, и он, похоже, переводит денежный тип MS SQL в число с плавающей точкой.
Я думаю, что ответ Алекса Мартелли указывает в правильном направлении.У кого-нибудь есть опыт работы с FreeTDS, MS SQL и python?Я думаю, что это, вероятно, требует своего собственного вопроса, поэтому я перенесу это обсуждение ... (новый вопрос размещен здесь: FreeTDS переводит денежный тип MS SQL в число с плавающей запятой, а не десятичное число )
Обновление : На самом деле во FreeTDS была ошибка.Это было исправлено в заголовке CVS FreeTDS от 4 августа 2010 года.