一般在處理帶有小數點的數值我們會將資料型態設定為浮點數
而MSSQL中常見的浮點數有
- Real:儲存七位有效數
- Float:儲存十五位有效數
- Decimal:儲存三十七位數(包含小數點前面跟後面),ex:Decimal(10,2)代表小數點前八位數,小數點後兩位數
用這幾種資料型態來儲存帶小數點的數值
舉例
輸入12345678901234567890,分別傳入三種資料型態的資料格位中
- Real:1.23456794E+19(七位數加後兩位誤差值)
- Float:1.2345678901234567E+19(十五位數加後兩位誤差值)
- Decimal(10,2):無法傳入=>Decimal(20,2):12345678901234567890.00
或許到這階段還看不出有什麼差別
舉例
以10000筆資料去加總
CREATE TABLE TEST
(
n1 REAL,n2 FLOAT, n3 DECIMAL(8,2)
)
DECLARE @CNT int
SET @CNT=0
WHILE (@CNT<10000)
BEGIN
INSERT INTO TEST VALUES(0.1,0.1,0.1)
SET @CNT=@CNT+1
END
SELECT n1,n2,n3 FROM TEST
SELECT SUM(n1),SUM(n2),SUM(n3) FROM TEST
結果
1000.00001490116 1000.00000000016 1000.00
可以看出Real跟Float分別都產生了誤差,Float因為有效位數較長所以誤差比較小
結論
雖然Decimal所占用的空間比較大,但為了保存數值的正確性上,還是比使用Real、Float來的好
文章標籤
全站熱搜

請教 0.1七位數科學記號是1.0000000E-01 10000個1.0000000E-01加總,怎麼變成1000.00001490116呢?
Float 儲存十五位有效數 但後面會多加兩位做紀錄 float 和 real 僅為近似值,而非精準值,在資料呈現上不會全然正確 所以上面的例子 我們設訂加10000次0.1時,其實是加0.10000000000000XX,所以最後加總的結果會出現些許的誤差。