我的数据存储在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';
答案 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';