時間:2024-02-05 12:47作者:下載吧人氣:22
在SQL Server中實際上只有兩種小數數值類型,分別是float(近似數值)和decimal(精確數值),這兩種類型能表示所有的小數數值類型。
float(近似數值類型)
float表示的是近似數值,存在一定的精度缺失。
float(n)
這里的n是以科學計數法存儲浮點數尾數的位數,因此此參數決定了精度和存儲的大小。其是可選的,默認值是53,即float等價于float(53),占用8bytes。如果指定了n,則它必須是介于1至53之間的值。實際上,雖然n的取值范圍定義是1至53,但實際上float只能表示float(53)和float(24)兩種類型,分別占用8bytes和4bytes。
n的范圍 | 精度 | 存儲大小 |
1-24(都視為24) | 7位小數 | 4bytes |
25-53(都視為53) | 15位小數 | 8bytes |
使用近似數值要格外注意盡量避免相等比較,因為比如1可以被存儲為1.000000056,也可以被存儲為1.00000000672,進行相等比較會得到意料之外的結果。
decimal(精確數值類型)
decimal表示的是精確數值類型。不存在精度損失,別名是numeric。
decimal(p, s)
— 等價于
numeric(p, s)
精確數值類型需要分別指定小數的最大位數(p)和小數位的數量(s):
p的大小也同時決定了存儲位數的大小:
精度大小 | 存儲位數 |
1-9 | 5 |
10-19 | 9 |
20-28 | 13 |
29-38 | 17 |
因為p和s必須遵守規則:0 <= s <= p <= 38,所以decimal(p, s)實際上能夠表示的有效值是從-10^38+1到10^38-1。這就意味著,decimal數據類型的最大精度是38,即最多可以存儲38位數字,所有這些數字均可位于小數點后面。decimal數據類型存儲精確的數字表示形式,沒有近似值。
小數的除法
小數的除法實際上是近似運算,因此在使用除法的時候SQL Server會自動將小數的類型提升為float類型(隱式數據類型升級)。
小數常量的默認數據類型是decimal,但是float類型的優先級比decimal類型要高。在默認的情況下,SQL Server會將小數數值的常量自動轉換為decimal數據類型(常態下),而在進行小數的除法運算的時候,則會就近進行數據類型的升級,轉換為float(24)或float(53)數據類型(運算時)。
簡單舉個例子,常量12.345在常態下會被解析并轉換為numeric(5, 3)的數值類型,即使用最小精度5和最小小數位數3;而在運算除法時,比如12.345/2則會被解析并轉換為float(24),即最小精度的近似數值類型。
小數轉為字符串
相比cast(float_expression as float(24/53)),使用str()函數更能夠有效控制近似數值的小數位數,因為str()函數獲取的是近似數值。
str(float_expression [ , length [ , decimal ] ])
網友評論