Подтвердить что ты не робот

Неправильные десятичные знаки, появляющиеся в СУММ 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

возвращается правильное значение. Что происходит в мире?

4b9b3361

Ответ 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 для получения желаемого результата.