Sql-Server-2008

AVG 函式返回錯誤的平均值

  • May 8, 2020

我有一個帶有 REAL 類型列的簡單表。

表中有 2 行,值為 0.23 和 0.24。如果我執行以下命令:

SELECT AVG(MyColumn) FROM dbo.MyTable

我希望得到 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;

結果:

0.234999999403954

現在使用 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;

結果:

0.235000

一些相關閱讀:

小數也不完美。如果您需要的小數位數超過支持的位數,則可能會失去精度,例如. 但對於大多數應用程序來說,這不是問題。

REAL 和 FLOAT 是近似數據類型。

來自:https ://msdn.microsoft.com/en-us/library/ms173773.aspx

“用於浮點數值數據的近似數字數據類型。浮點數據是近似的;因此,並非數據類型範圍內的所有值都可以精確表示。”

引用自:https://dba.stackexchange.com/questions/93308