[MS-SQL] 數字處理-浮點數計算誤差

一般在處理帶有小數點的數值我們會將資料型態設定為浮點數

而MSSQL中常見的浮點數有

  • Real:儲存七位有效數
  • Float:儲存十五位有效數
  • Decimal:儲存三十七位數(包含小數點前面跟後面)
    ex:Decimal(10,2)代表小數點前八位數,小數點後兩位數

用上次這幾種資料型態來儲存帶小數點的數值

EX:

以100000筆資料去加總

drop TABLE KKtable
go
CREATE TABLE KKtable
(
r1 REAL,f2 FLOAT, d3 DECIMAL(8,2)
)

DECLARE @count int
SET @count=0
WHILE (@count<100000)
BEGIN
INSERT INTO KKtable VALUES(0.1,0.1,0.1)
SET @count=@count+1
END

SELECT r1,f2,d3 FROM KKtable
SELECT SUM(r1),SUM(f2),SUM(d3) FROM KKtable

結果如下

---------------------- ---------------------- ---------------------------------------
10000.0001490116       10000.0000000188       10000.00

(1 row(s) affected)

結論

可以看到Real跟Float都產生了誤差

所以為了保存述職的正確性

還是使用Decimal比較好

期待您的留言

Comments

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *