Неправильные десятичные знаки, появляющиеся в СУММ MySQL
У меня есть следующий SQL-запрос.
SELECT SUM(final_insurance_total) as total
FROM `leads`
GROUP BY leads.status
У меня есть одна строка данных в ведущей таблице со значением для final_insurance_total из 458796. Тип данных для final_insurance_total float
.
По какой-то причине MySQL суммирует одну строку как "458796.375".
Если я изменил запрос на
SELECT (final_insurance_total) as total
FROM `leads`
GROUP BY leads.status
возвращается правильное значение. Что происходит в мире?
Ответы
Ответ 1
Типы FLOAT
и DOUBLE
в MySQL (а также в других базах данных и времени исполнения на языке программирования) представлены особым образом, что приводит к тому, что значения, хранящиеся как аппроксимации, а не точные значения. См. MySQL docs, а также общая информация о арифметике с плавающей запятой.
Чтобы сохранить и использовать точные значения, используйте тип DECIMAL
(см. https://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-characteristics.html).
EDIT: Я проверил несколько тестов, и, хотя ошибки точности с плавающей запятой довольно распространены, этот конкретный вариант относится к реализации SUM()
в MySQL. Другими словами, это ошибка, которая была там в течение длительного времени. В любом случае вы должны использовать DECIMAL
как свой тип поля.
Ответ 2
FLOAT
не гарантирует точность при выполнении каких-либо вычислений. Если вы используете простой SELECT
, расчет не производится, поэтому вы получаете исходное значение. Но если вы используете SUM()
, даже с одной строкой, выполняется хотя бы одно добавление (0 + current_value
).
Вам действительно нужно FLOAT
? Например, если у вас есть две десятичные цифры, вы можете использовать INT и умножить все значения на 100 до всех INSERT
s. Когда результаты SELECT
ing, вы разделите их на 100.
Ответ 3
Если пользователь не является системным администратором и не может изменить тип данных поля, такого как FLOAT, пользователь может использовать CAST для получения желаемого результата.