MySQL AVG函数提供比预期更多的小数

时间:2019-03-06 10:06:10

标签: mysql mariadb average

我的数据存储在MySQL数据库版本中:10.1.37-MariaDB,innodb_version:5.6.41-84.1。我运行查询以使用AVG获取列的平均值。返回3行,其平均值为18.06、18.44和20.05。问题是为什么AVG返回18.849999999999998?列数据类型为double。

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

3 个答案:

答案 0 :(得分:1)

Double不是精确类型,它是float的更精确版本。如果要精确,则应使用精确的数字列类型。从MySQL documentation

  

DECIMAL和NUMERIC类型存储精确的数字数据值。当保留精确度非常重要时,例如使用货币数据,则使用这些类型。在MySQL中,NUMERIC被实现为DECIMAL,因此以下有关DECIMAL的说明同样适用于NUMERIC。

您可以通过四舍五入的方式在表示端解决此问题,但可以使用精确的数字类型作为更长期的解决方案。

答案 1 :(得分:0)

您可以使用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';

答案 2 :(得分:0)

您可以使用FORMAT

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