Точное десятичное деление в 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
Другие вопросы по тегам