我有一个带有 REAL 类型列的简单表。
表中有 2 行,值分别为 0.23 和 0.24。如果我运行以下命令:
SELECT AVG(MyColumn) FROM dbo.MyTable
Run Code Online (Sandbox Code Playgroud)
我希望得到 0.235 的结果,但实际上我得到 0.2349999901234。
有人可以告诉我为什么吗?
停止使用 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)
一些相关阅读:
十进制也不是完美的。例如,如果您需要的小数位数超出支持的位数,则可能会失去精度。但对于大多数应用程序来说,这不是问题。