n的范圍 | 精度 | 存儲大小 |
1-24(都視為24) | 7位小數(shù) | 4bytes |
25-53(都視為53) | 15位小數(shù) | 8bytes |
使用近似數(shù)值要格外注意盡量避免相等比較,因為比如1可以被存儲為1.000000056,也可以被存儲為1.00000000672,進行相等比較會得到意料之外的結(jié)果。
decimal(精確數(shù)值類型)
decimal表示的是精確數(shù)值類型。不存在精度損失,別名是numeric。
decimal(p, s)
-- 等價于
numeric(p, s)
精確數(shù)值類型需要分別指定小數(shù)的最大位數(shù)(p)和小數(shù)位的數(shù)量(s):
p的大小也同時決定了存儲位數(shù)的大?。?/p>
精度大小 | 存儲位數(shù) |
1-9 | 5 |
10-19 | 9 |
20-28 | 13 |
29-38 | 17 |
因為p和s必須遵守規(guī)則:0 = s = p = 38,所以decimal(p, s)實際上能夠表示的有效值是從-10^38+1到10^38-1。這就意味著,decimal數(shù)據(jù)類型的最大精度是38,即最多可以存儲38位數(shù)字,所有這些數(shù)字均可位于小數(shù)點后面。decimal數(shù)據(jù)類型存儲精確的數(shù)字表示形式,沒有近似值。
小數(shù)的除法
小數(shù)的除法實際上是近似運算,因此在使用除法的時候SQL Server會自動將小數(shù)的類型提升為float類型(隱式數(shù)據(jù)類型升級)。
小數(shù)常量的默認數(shù)據(jù)類型是decimal,但是float類型的優(yōu)先級比decimal類型要高。在默認的情況下,SQL Server會將小數(shù)數(shù)值的常量自動轉(zhuǎn)換為decimal數(shù)據(jù)類型(常態(tài)下),而在進行小數(shù)的除法運算的時候,則會就近進行數(shù)據(jù)類型的升級,轉(zhuǎn)換為float(24)或float(53)數(shù)據(jù)類型(運算時)。
簡單舉個例子,常量12.345在常態(tài)下會被解析并轉(zhuǎn)換為numeric(5, 3)的數(shù)值類型,即使用最小精度5和最小小數(shù)位數(shù)3;而在運算除法時,比如12.345/2則會被解析并轉(zhuǎn)換為float(24),即最小精度的近似數(shù)值類型。
小數(shù)轉(zhuǎn)為字符串
相比cast(float_expression as float(24/53)),使用str()函數(shù)更能夠有效控制近似數(shù)值的小數(shù)位數(shù),因為str()函數(shù)獲取的是近似數(shù)值。
str(float_expression [ , length [ , decimal ] ])
str()函數(shù)可以接受length、decimal兩個參數(shù),皆是可選的。
將decimal常量轉(zhuǎn)換為varchar類型:
select str(123.45, 10, 2); -- 123.45
將float表達式的值轉(zhuǎn)換為varchar類型(位數(shù)不足自動補0):
select str(1.0/3, 10, 8); -- 0.33333300
對小數(shù)常量轉(zhuǎn)換為varchar類型,減少小數(shù)位的數(shù)量,由2位減少為1位(會自動進行四舍五入運算):
select str(123.45, 6, 1); -- 123.5
使用函數(shù)str或cast將float和decimal強制轉(zhuǎn)換為varchar類型時,返回的數(shù)值可能是不相同的:
select str(56.64564684439527, 38, 20); -- 56.64564684438742000000 select cast(56.64564684439527 as varchar(100)); -- 56.64564684439527
這是因為兩種函數(shù)的處理方式的不同導(dǎo)致的:str()函數(shù)會對小數(shù)數(shù)值先取近似值;而cast()函數(shù)則是返回與原始值數(shù)據(jù)類型相同的值(decimal返回精確值,float返回近似值)。
以上就是詳細分析sqlserver中的小數(shù)類型(float和decimal)的詳細內(nèi)容,更多關(guān)于sqlserver 小數(shù)類型的資料請關(guān)注腳本之家其它相關(guān)文章!
標(biāo)簽:防疫戰(zhàn)設(shè) 天水 宿州 威海 來賓 銅仁 益陽 七臺河
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳細分析sqlserver中的小數(shù)類型(float和decimal)》,本文關(guān)鍵詞 詳細,分析,sqlserver,中的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。