Точное десятичное деление в MySQL
Как правильно разделить два DECIMAL
значения в MySQL и получить результат с точностью до количества цифр, определенных в типе столбца?
Пример:
select cast(1/2 as decimal(4,4)),
cast(1 as decimal(4,4))/2,
cast(1 as decimal(4,4))/cast(2 as decimal(4,4));
Результаты:
'0.5000', '0.49995000', '1.00000000'
Почему второй результат неточен? Почему третий результат не "0.5000"?
Примечание: я не могу просто использовать первую форму, мне нужно выполнять вычисления со столбцами, которые хранятся в виде десятичных дробей.
1 ответ
Проблема в том, что для объявления типа данных DECIMAL требуется 2 аргумента, первый из которых - общее количество цифр, включая дробную часть.
Согласно документам ( http://dev.mysql.com/doc/refman/5.7/en/precision-math-decimal-characteristics.html):
Синтаксис объявления для столбца DECIMAL - DECIMAL(M,D). Диапазоны значений для аргументов в MySQL 5.1 следующие:
М - максимальное количество цифр (точность). Диапазон значений от 1 до 65. (В более старых версиях MySQL диапазон допускался от 1 до 254.)
D - количество цифр справа от десятичной точки (шкала). Он имеет диапазон от 0 до 30 и должен быть не больше чем M.
Так что если вы используете 5 цифр вместо 4, все в порядке:
select cast(1/2 as decimal(5,4)),
cast(1 as decimal(5,4))/2,
cast(1 as decimal(5,4))/cast(2 as decimal(5,4)),
cast(cast(1 as decimal(5,4))/cast(2 as decimal(5,4)) as decimal(5,4));
Результаты
0.5000, 0.50000000, 0.50000000, 0.5000