Есть ли какие-либо распространенные ошибки с использованием десятичной дроби в отличие от двойной в MySQL? - PullRequest
3 голосов
/ 07 июня 2010

Мой друг сказал, что у него возникли странности с использованием столбца decimal для хранения таких форматов денег, как сохранение 1000.00, в результате чего он будет храниться как 999.99.

Однако я только что проверил, и 1000.00 сохраняется как 1000.0000 на decimal(19,4) / MySQL 5. Может кто-нибудь предложить понимание, почему у них могут возникнуть проблемы? Возможно, это была старая ошибка MySQL, неправильные вычисления на стороне приложения перед сохранением в базе данных?

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

Ответы [ 2 ]

3 голосов
/ 07 июня 2010

Для точных числовых представлений следует использовать тип данных DECIMAL, а не DOUBLE. Цитирование из MySQL документации по числовым типам :

MySQL поддерживает все стандартные числовые типы данных SQL. К этим типам относятся типы данных точные числовые (INTEGER, SMALLINT, DECIMAL и NUMERIC), а также приблизительные числовые типы (FLOAT, REAL и DOUBLE PRECISION).

...

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

2 голосов
/ 07 июня 2010

Вкл. 1.14.2. ДЕЦИМАЛЬНЫЕ Изменения Типа данных , где обсуждаются изменения в десятичном типе, это говорит это:

В более старых версиях MySQL десятичные значения могут иметь до 254 цифр. Однако расчеты проводились с использованием плавающей запятой и поэтому были приблизительными, а не точными.

Это может быть источником ошибки, о которой говорил ваш друг. Если вычислено значение 1000,00, оно будет подвержено ошибкам с плавающей запятой.

Я бы выбрал decimal для хранения денежных значений, поскольку расчеты будут более точными, чем при использовании double.

...