人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

詳細分析sqlserver中的小數(shù)類型(float和decimal)

發(fā)布日期:2021-12-09 14:51 | 文章來源:站長之家

在SQL Server中實際上只有兩種小數(shù)數(shù)值類型,分別是float(近似數(shù)值)和decimal(精確數(shù)值),這兩種類型能表示所有的小數(shù)數(shù)值類型。

float(近似數(shù)值類型)

float表示的是近似數(shù)值,存在一定的精度缺失。

float(n)

這里的n是以科學計數(shù)法存儲浮點數(shù)尾數(shù)的位數(shù),因此此參數(shù)決定了精度和存儲的大小。其是可選的,默認值是53,即float等價于float(53),占用8bytes。如果指定了n,則它必須是介于1至53之間的值。實際上,雖然n的取值范圍定義是1至53,但實際上float只能表示float(53)和float(24)兩種類型,分別占用8bytes和4bytes。

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(precision):指定小數(shù)的最大位數(shù),小數(shù)點的左側(cè)和右側(cè)的數(shù)字的總數(shù)量不能超過p,p的取值范圍是從1到38,默認值為18。
  • s(scale):指定在小數(shù)點右側(cè)的小數(shù)位數(shù),p-s是小數(shù)點左邊的最大位數(shù)。s必須是從0到p的值,只有在指定了精度的情況下才能指定s,s的默認值是0,因此,0 <= s <= p。

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ù),皆是可選的。

  • length是小數(shù)的總位數(shù),包含正負符號,小數(shù)點,小數(shù)點左邊和右邊數(shù)字個數(shù)之和;
  • decimal是小數(shù)位的數(shù)量(小數(shù)點右邊數(shù)字個數(shù)),小數(shù)位最大為16位,不能超過16,否則,會被截斷為16位。如果小數(shù)位沒有decimal多,那么右邊補0。
  • 返回值是varchar類型。

將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ù)的處理方式的不同導致的:str()函數(shù)會對小數(shù)數(shù)值先取近似值;而cast()函數(shù)則是返回與原始值數(shù)據(jù)類型相同的值(decimal返回精確值,float返回近似值)。

以上就是詳細分析sqlserver中的小數(shù)類型(float和decimal)的詳細內(nèi)容,更多關(guān)于sqlserver 小數(shù)類型的資料請關(guān)注本站其它相關(guān)文章!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部