Как бороться с ошибками округления плавающих типов для финансовых расчетов в Python SQLite? - PullRequest
4 голосов
/ 26 ноября 2009

Я создаю финансовое приложение, и кажется, что мои плавающие в sqlite плавают вокруг. Иногда 4.0 будет 4.000009, а 6.0 будет 6.00006, и тому подобное. Как я могу сделать их более точными и не повлиять на мои финансовые расчеты?

Значения поступают из Python, если это имеет значение. Не уверен, из какой области искажены цифры.

Ответы [ 6 ]

7 голосов
/ 26 ноября 2009

Пожалуйста, используйте десятичное число

http://docs.python.org/library/decimal.html

4 голосов
/ 26 ноября 2009

Поскольку это финансовое приложение, , если , у вас есть расчеты только с 2 или 3 десятичными разрядами, вы можете хранить все данные внутри себя как целые числа и преобразовывать их только в числа с плавающей точкой для целей презентации.

* 1005 Е.Г. *

6.00 -> 600
4.35 -> 435
3 голосов
/ 26 ноября 2009

Это распространенная проблема с использованием SQLite, так как он не имеет тип валюты.
Как сказал С.Марк, вы можете использовать библиотеку представлений Decimal . Однако SQLite 3 поддерживает только двоичные числа с плавающей запятой (тип sqlite REAL), поэтому вам придется хранить десятичное закодированное число с плавающей запятой как TEXT или BLOB или преобразовывать в REAL (но тогда вы вернетесь к 64-битному двоичному числу с плавающей запятой)
Поэтому подумайте о диапазоне чисел, которые вам нужно представить, и о том, нужно ли вам выполнять вычисления из базы данных.

Возможно, вам лучше использовать другую БД, которая поддерживает ЧИСЛОВЫЕ типы, например MYSql , PostgreSQL , Firebird

1 голос
/ 27 ноября 2009

Используйте Десятичное число , чтобы манипулировать вашими цифрами, затем используйте pickle , чтобы сохранить его и загрузить из SQLite как текст, поскольку он не обрабатывает числовые типы.

Наконец, используйте unitest и doctest , для финансовых операций вы хотите убедиться, что весь код делает то, что он должен делать в любых обстоятельствах. Вы не можете исправлять ошибки, как, скажем, в социальной сети ...

1 голос
/ 26 ноября 2009

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

Если важна производительность, вы можете рассмотреть возможность использования целых чисел для представления соответствующей денежной единицы - часто это нормально, центы или десятые доли центов.

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

0 голосов
/ 26 ноября 2009

Вы должны использовать десятичные числа. Десятичные числа могут быть представлены точно.

В десятичной переменной с плавающей запятой 0.1 + 0.1 + 0.1 - 0.3 точно равно нулю. В двоичной переменной с плавающей запятой результат равен 5.5511151231257827e-017.

Итак, просто попробуйте десятичное число:

import decimal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...