引言
今天和測試溝通一個百分比計算方式時遇到一個問題, 我在存儲過程裡用到了強轉CAST(32.678 AS DECIMAL(5,1)) 我認為該方式只會保留一位小數,我給測試的回復是我並沒有用到四捨五入函數,數據也沒有四捨五入,而測試說他們自己驗證後覺的數據是經過四捨五入了的。 想到這裡於是我再試了試存儲過程的每個計算點,才發現了這個問題。
ROUND
那麼用到四捨五入並且保留小數點時我們肯定會首選ROUND函數, 如果字段的數據類型是decimal(18,10)時那麼四捨五入後還會有很多0出現。
CAST和CONVERT
其實我使用強轉時並沒有打算四捨五入結果,只是單純為了得到符合我要求的數據,今天才發現這兩個強轉也會四捨五入結果,也就是說下面三個語句將會返回相同的結果值
select ROUND(32.678,1) --32.700 select CAST(32.678 as DECIMAL(5,1)) --32.7 select convert(NUMERIC(5,1),32.678) --32.7
下面抽個空給大家介紹SQL的四捨五入ROUND函數
SQL四捨五入2007/11/01 16:35問題1:
SELECT CAST('123.456' as decimal)
將會得到 123(小數點後面的將會被省略掉)。
如果希望得到小數點後面的兩位。
則需要把上面的改為
SELECT CAST('123.456' as decimal(38, 2)) ===>123.46
自動四捨五入了!
問題2:
SELECT ROUND(123.75633, 2, 1), ROUND(123.75633, 2)
上面的SQL得到的2個值是不一樣的,前一個是:123.75000,後一個是:123.76000。
因為前者在進行四捨五入之前,小數點後已經被截取,保留了2位。
而後者則沒有被截取,四捨五入時自然就會得到123.76000
ROUND
返回數字表達式並四捨五入為指定的長度或精度。
語法
ROUND ( numeric_e-xpression , length [ , function ] )
參數
numeric_e-xpression
精確數字或近似數字數據類型類別的表達式(bit 數據類型除外)。
length
是 numeric_e-xpression 將要四捨五入的精度。length 必須是 tinyint、smallint 或int。當 length 為正數時,numeric_e-xpression 四捨五入為 length 所指定的小數位數。當 length 為負數時,numeric_e-xpression 則按 length 所指定的在小數點的左邊四捨五入。
function
是要執行的操作類型。function 必須是 tinyint、smallint 或 int。如果省略 function 或 function 的值為 0(默認),numeric_e-xpression 將四捨五入。當指定 0 以外的值時,將截斷 numeric_e-xpression。
返回類型
返回與 numeric_e-xpression 相同的類型。
注釋
ROUND 始終返回一個值。如果 length 是負數且大於小數點前的數字個數,ROUND 將返回 0。
示例 結果
ROUND(748.58, -4) 0
當 length 是負數時,無論什麼數據類型,ROUND 都將返回一個四捨五入的 numeric_e-xpression。
示例 結果
ROUND(748.58, -1) 750.00
ROUND(748.58, -2) 700.00
ROUND(748.58, -3) 1000.00
示例
A. 使用 ROUND 和估計值
下例顯示兩個表達式,說明使用 ROUND 函數且最後一個數字始終是估計值。
Select ROUND(123.9994, 3), ROUND(123.9995, 3) GO
下面是結果集:
----------- -----------
123.9990 124.0000
B. 使用 ROUND 和四捨五入的近似值
下例顯示四捨五入和近似值。
語句 結果
Select ROUND(123.4545, 2)
123.4500
Select ROUND(123.45, -2)
100.00
C. 使用 ROUND 截斷
下例使用兩個 Select 語句說明四捨五入和截斷之間的區別。第一個語句四捨五入結果。第二個語句截斷結果。
語句 結果
Select ROUND(150.75, 0) 151.00 Select ROUND(150.75, 0, 1) 150.00