Sql-Server-2008
AVG 函式返回錯誤的平均值
我有一個帶有 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
一些相關閱讀:
- http://web.archive.org/web/20130205023610/http://classicasp.aspfaq.com/general/why-does-3-2-1-5-4-7000000000000002.html
- http://web.archive.org/web/20120208202619/http://databases.aspfaq.com/database/what-datatype-should-i-use-for-numeric-columns.html
- https://sqlblog.org/2009/10/12/bad-habits-to-kick-choosing-the-wrong-data-type
小數也不完美。如果您需要的小數位數超過支持的位數,則可能會失去精度,例如. 但對於大多數應用程序來說,這不是問題。
REAL 和 FLOAT 是近似數據類型。
來自:https ://msdn.microsoft.com/en-us/library/ms173773.aspx
“用於浮點數值數據的近似數字數據類型。浮點數據是近似的;因此,並非數據類型範圍內的所有值都可以精確表示。”