SQL 中詳解round(),floor(),ceiling()函數的用法和區別?
Examda提示:如果不理解基本的數據類型和四舍五入函數,那么你就可能誤解四舍五入。由於數據類型的差異(比如integer,float, decimal等等),四舍五入后的值可能會不同。另外,由於在計算中使用的SQL Server舍入函數(ROUND(),CEILING(),FLOOR())的差異,得到的結果值也可能會不同。因此,找到用戶對四舍五入的要求接着把這些要求轉化到適當的T-SQL命令中是很重要的。
讓我們先從定義的角度開始:
ROUND() – 四舍五入一個正數或者負數,結果為一定長度的值。
CEILING() - 返回最小的整數,使這個整數大於或等於指定數的數值運算。
FLOOR() - 返回最大整數,使這個整數小於或等於指定數的數值運算。
讓我們來看看有不同數據類型的函數的結果。
ROUND(),CEILING()和FLOOR()例子
例子
值
在這個例子中,你可以看到,在一個正整數的情況下,這三個舍入函數返回相同的值。
DECLARE @value int
SET @value = 6
SELECT ROUND(@value, 1) 6
SELECT CEILING(@value) 6
SELECT FLOOR(@value) 6
在第二個例子中,即使在一個負整數的情況下,這三個舍入函數還是返回相同的值。
DECLARE @value int
SET @value = -11
SELECT ROUND(@value, 1) -11
SELECT CEILING(@value) -11
SELECT FLOOR(@value) -11
要證明整數這個觀點,四舍五入是不可能的。讓我們來看看一些其他的數據類型。
DECLARE @value int
SET @value = -11.5
SELECT ROUND(@value, 2) -11
SELECT CEILING(@value) -11
SELECT FLOOR(@value) -11
在我們的例子中,用一個小數數據類型和不同長度參數(比如1,2或者3)的舍入函數會產生不同的終值。當四舍五入這個值並且長度參數是1時,小數點后第二位的5是有意義的。另外,在小數數據類型中,CEILING和 FLOOR函數也會考慮小數位,因為會得到不同的值。
DECLARE @value decimal(10,2)
SET @value = 11.05
SELECT ROUND(@value, 1) 11.10
SELECT ROUND(@value, 2) 11.05
SELECT ROUND(@value, 3) 11.05
SELECT CEILING(@value) 12
SELECT FLOOR(@value) 11
如同上面的例子,基於不同的長度參數,小數點后第二位的6是有意義的。
DECLARE @value decimal(10,2)
SET @value = -14.46
SELECT ROUND(@value, 1) -14.50
SELECT ROUND(@value, 2) -14.46
SELECT ROUND(@value, 3) -14.46
SELECT CEILING(@value) -14
SELECT FLOOR(@value) -15
這個例子也有助於描述四舍五入值的破壞。這個例子也證明了CEILING和 FLOOR 函數四舍五入成最近的函數。
DECLARE @value decimal(10,10)
SET @value = .5432167890
SELECT ROUND(@value, 1) 0.5000000000
SELECT ROUND(@value, 2) 0.5400000000
SELECT ROUND(@value, 3) 0.5430000000
SELECT ROUND(@value, 4) 0.5432000000
SELECT ROUND(@value, 5) 0.5432200000
SELECT ROUND(@value, 6) 0.5432170000
SELECT ROUND(@value, 7) 0.5432168000
SELECT ROUND(@value, 8) 0.5432167900
SELECT ROUND(@value, 9) 0.5432167890
SELECT ROUND(@value, 10) 0.5432167890
SELECT CEILING(@value) 1
SELECT FLOOR(@value) 0
在最后的例子中,你可以看到在浮點數據類型里采取與上面小數點的例子相同類型的行為。另外,CEILING和FLOOR函數四舍五入成最近的函數。
DECLARE @value float(10)
SET @value = .1234567890
SELECT ROUND(@value, 1) 0.1
SELECT ROUND(@value, 2) 0.12
SELECT ROUND(@value, 3) 0.123
SELECT ROUND(@value, 4) 0.1235
SELECT ROUND(@value, 5) 0.12346
SELECT ROUND(@value, 6) 0.123457
SELECT ROUND(@value, 7) 0.1234568
SELECT ROUND(@value, 8) 0.12345679
SELECT ROUND(@value, 9) 0.123456791
SELECT ROUND(@value, 10) 0.123456791
SELECT CEILING(@value) 1
SELECT FLOOR(@value) 0