AVG 函数返回错误的平均值

0 sql-server-2008 functions

我有一个带有 REAL 类型列的简单表。

表中有 2 行,值分别为 0.23 和 0.24。如果我运行以下命令:

SELECT AVG(MyColumn) FROM dbo.MyTable
Run Code Online (Sandbox Code Playgroud)

我希望得到 0.235 的结果,但实际上我得到 0.2349999901234。

有人可以告诉我为什么吗?

Aar*_*and 9

停止使用 REAL 并改用 DECIMAL。REAL 和 FLOAT 是近似数据类型,不能以您习惯的漂亮、四舍五入的方式表示所有数字。比较这些:

DECLARE @a REAL = 0.23, @b REAL = 0.24;
SELECT AVG(r) FROM (SELECT r = @a UNION SELECT r = @b) AS x;
Run Code Online (Sandbox Code Playgroud)

结果:

0.234999999403954
Run Code Online (Sandbox Code Playgroud)

现在使用 DECIMAL 代替:

DECLARE @a DECIMAL(10,4) = 0.23, @b DECIMAL(10,4) = 0.24;
SELECT AVG(r) FROM (SELECT r = @a UNION SELECT r = @b) AS x;
Run Code Online (Sandbox Code Playgroud)

结果:

0.235000
Run Code Online (Sandbox Code Playgroud)

一些相关阅读:

十进制也不是完美的。例如,如果您需要的小数位数超出支持的位数,则可能会失去精度。但对于大多数应用程序来说,这不是问题。

  • 当您选择 Floating-Point Arithmetic http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 时,这里有一个稍微有点书呆子的解释。 (2认同)