搜尋本站文章

2009-06-30

認識 ROUND 函數,以 SQL Server 2008 為例

與幾個朋友討論 ROUND 函數的使用方式,寫一篇文章與各位分享。
請參考以下的範例:

--EX1. 傳回數值,捨入到指定的長度或有效位數。
-- 語法:ROUND ( numeric_expression , length [ ,function ] )
SELECT ROUND(123.9994, 3), ROUND(123.9995, 3), ROUND(123.9996, 3)



01




--EX2. 有關於 0.點的精確數值之轉換
-- 被截斷
SELECT ROUND(0.4, 0)



02







--  判斷需要進位,但卻發生錯誤。
SELECT ROUND(0.5, 0)
/* 回傳錯誤訊息:
訊息 8115,層級 16,狀態 2,行 1
轉換 expression 到資料類型 numeric 時發生算術溢位錯誤。

訊息 8115,層級 16,狀態 2,行 1
Arithmetic overflow error converting expression to data type numeric.
*/

03







-- 使用CAST 函數,明確的資料轉型
SELECT CAST (0.5 AS numeric(2,1))



04




-- 再搭配使用 ROUND 捨入到指定的長度或有效位數。
SELECT ROUND(CAST (0.4 AS numeric(2,1)), 0), ROUND(CAST (0.5 AS numeric(2,1)), 0), ROUND(CAST (0.6 AS numeric(2,1)), 0)



05




-- 或是使用單引號,以字串的類型來做處理。
SELECT ROUND('0.4', 0), ROUND('0.5', 0), ROUND('0.6', 0)



06




--EX3. 捨入到指定的長度或有效位數。
-- 語法:ROUND ( numeric_expression , length [ ,function ] )
SELECT ROUND(150.45, 0), ROUND(150.55, 0),  ROUND(150.65, 0)



07




--EX4. function 指定 0 以外的值時,會截斷
/*
語法:ROUND ( numeric_expression , length [ ,function ] )
當省略 function,或其值為 0 (預設值) 時,會捨入 numeric_expression。
當指定 0 以外的值時,會截斷 numeric_expression。
*/
SELECT ROUND(150.75, 0, 1);



08








以下是摘錄 SQL Server 2008 線上叢書:ROUND (Transact-SQL)

ROUND (Transact-SQL)


傳回數值,捨入到指定的長度或有效位數。


語法:


ROUND ( numeric_expression , length [ ,function ] )


ROUND 一律傳回值。如果 length 是負的,且大於小數點前面的位數,ROUND 會傳回 0。


--


參數說明:


numeric_expression


這是精確數值或近似數值資料類型類別目錄的運算式,但 bit 資料類型除外。


length


這是 numeric_expression 捨入的有效位數。


length 必須是 tinyint、smallint 或 int 類型的運算式。


當 length 是正數時,numeric_expression 會捨入到 length 所指定的十進位數。


當 length 是負數時,numeric_expression 會依照 length 所指定,在小數點左側捨入。


function


這是要執行的作業類型。function 必須是 tinyint、smallint 或 int。


當省略 function,或其值為 0 (預設值) 時,會捨入 numeric_expression。


當指定 0 以外的值時,會截斷 numeric_expression。






參考資料:

ROUND (Transact-SQL)


http://msdn.microsoft.com/en-us/library/ms175003.aspx