SQL 中詳解round(),floor(),ceiling()函數的用法和區別?


SQL 中詳解round(),floor(),ceiling()函數的用法和區別?

原創 2013年06月09日 14:00:21
 
摘自:http://blog.csdn.net/yueliangge910101/article/details/9064021
          應用中使用四舍五入的值,我和我的用戶在報表應用中的計算問題存在分歧。所有的代碼都在T-SQL中,但是我認為報表問題與數據類型和向下取整或向上取整規則關系密切。請問您有沒有這方面的高見?我想看到一些帶有不同編碼選項的例子。
   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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM