搜尋本站文章

2010-07-01

使用 ROUND、CEILING、FLOOR 函數,執行四捨五入到整數、無條件捨去到整數、無條件進位到整數、無條件捨去到指定的有效位數

若要對數值資料,執行四捨五入到整數、無條件捨去到整數、無條件進位到整數、無條件捨去到指定的有效位數等作業,可以使用 ROUND、CEILING、FLOOR 函數來達到需求。

請參考以下的範例程式碼:


-- 01 建立範例資料表
USE tempdb
GO
CREATE TABLE math01
(rid int IDENTITY(1,1), decData decimal(5,2) )
GO
INSERT math01 VALUES(10.44)
INSERT math01 VALUES(10.55)
INSERT math01 VALUES(10.66)
GO

-- 02 查詢資料表
SELECT * FROM math01





--03 使用 ROUND、CEILING 函數,執行四捨五入到整數、無條件捨去到整數、無條件進位到整數
SELECT rid, decData N'原始資料',
ROUND(decData,0) N'ROUND() 四捨五入到整數',
ROUND(decData,0,1) N'ROUND() 無條件捨去到整數',
CEILING(decData) N'CEILING() 無條件進位到整數'
FROM math01




--04 使用 ROUND、FLOOR 函數,執行無條件捨去到整數、無條件捨去到指定的有效位數
SELECT rid, decData N'原始資料',
FLOOR(decData) N'FLOOR() 無條件捨去到整數',
ROUND(decData,0,1) N'ROUND() 無條件捨去到整數',
ROUND(decData,1,1) N'ROUND() 無條件捨去到小數點第一位數'
FROM math01





但要請您留意的是 CEILING 與、 FLOOR 函數,只能處理到「整數」。

無法如同 ROUND 函數一般,自行指定要處理的有效位數。



CEILING (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。



FLOOR (Transact-SQL)
傳回小於或等於指定數值運算式的最大整數。
CEILING 函數會傳回大於或等於指定的數值運算式之最小整數。

FLOOR 函數會傳回小於或等於指定的數值運算式之最大整數。
例如,以數值運算式 12.9273 為例,CEILING 會傳回 13,FLOOR 會傳回 12。


參考資料:
CEILING (Transact-SQL)
http://msdn.microsoft.com/zh-tw/library/ms189818.aspx

ROUND (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms175003.aspx

FLOOR (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms178531.aspx

CEILING 與 FLOOR 的比較
http://msdn.microsoft.com/zh-tw/library/ms190927.aspx

認識 ROUND 函數,以 SQL Server 2008 為例
http://sharedderrick.blogspot.com/2009/06/round-sql-server-2008.html