Функция MySQL AVG дает больше десятичного числа, чем ожидалось - PullRequest
0 голосов
/ 06 марта 2019

У меня есть данные, хранящиеся в версии MySQL DB: 10.1.37-MariaDB, innodb_version: 5.6.41-84.1. Я запускаю запрос, чтобы получить среднее значение столбца, используя AVG. Возвращаются 3 строки и средние значения 18.06, 18.44 и 20.05. Вопрос в том, почему AVG возвращает 18,849999999999998? Тип данных столбца двойной.

select avg(col_0) from table where col_1='xxx' and col_2='yyy';

Ответы [ 3 ]

1 голос
/ 06 марта 2019

Double не является точным типом, это более точная версия float.Вы должны использовать точный числовой тип столбца, если вам нужна точная точность.Из документации MySQL :

Типы DECIMAL и NUMERIC хранят точные числовые значения данных.Эти типы используются, когда важно сохранить точную точность, например, с денежными данными.В MySQL NUMERIC реализован как DECIMAL, поэтому следующие замечания о DECIMAL в равной степени применимы к NUMERIC.

Вы можете обойти это на стороне представления, округлив, но для точного более точного числового типадолгосрочное решение.

0 голосов
/ 06 марта 2019

Вы можете использовать ФОРМАТ

select FORMAT(avg(col_0),2) from table where col_1='xxx' and col_2='yyy';
0 голосов
/ 06 марта 2019

Вы можете использовать round ():

select ROUND(avg(col_0),2) from table where col_1='xxx' and col_2='yyy';

Это даст вам 2 десятичных знака.

Вы также можете использовать CAST ()

select CAST(avg(col_0),2) AS DECIMAL (10,2)) from table where col_1='xxx' and col_2='yyy';
...