SQLServer中的Rounding函數(shù)

字號:

應(yīng)用中使用四舍五入的值,我和我的用戶在報表應(yīng)用中的計算問題存在分歧。所有的代碼都在T-SQL中,但是我認(rèn)為報表問題與數(shù)據(jù)類型和向下取整或向上取整規(guī)則關(guān)系密切。請問您有沒有這方面的高見?我想看到一些帶有不同編碼選項(xiàng)的例子。
    Examda提示:如果不理解基本的數(shù)據(jù)類型和四舍五入函數(shù),那么你就可能誤解四舍五入。由于數(shù)據(jù)類型的差異(比如integer,float, decimal等等),四舍五入后的值可能會不同。另外,由于在計算中使用的SQL Server舍入函數(shù)(ROUND(),CEILING(),F(xiàn)LOOR())的差異,得到的結(jié)果值也可能會不同。因此,找到用戶對四舍五入的要求接著把這些要求轉(zhuǎn)化到適當(dāng)?shù)腡-SQL命令中是很重要的。
    讓我們先從定義的角度開始:
    l ROUND() – 四舍五入一個正數(shù)或者負(fù)數(shù),結(jié)果為一定長度的值。
    l CEILING() - 返回最小的整數(shù),使這個整數(shù)大于或等于指定數(shù)的數(shù)值運(yùn)算。
    l FLOOR() - 返回整數(shù),使這個整數(shù)小于或等于指定數(shù)的數(shù)值運(yùn)算。
    讓我們來看看有不同數(shù)據(jù)類型的函數(shù)的結(jié)果。
    ROUND(),CEILING()和FLOOR()例子
    例子
     值
    在這個例子中,你可以看到,在一個正整數(shù)的情況下,這三個舍入函數(shù)返回相同的值。
    DECLARE @value int
    SET @value = 6
    SELECT ROUND(@value, 1)
    SELECT CEILING(@value)
    SELECT FLOOR(@value)
    6
    6
    6
    在第二個例子中,即使在一個負(fù)整數(shù)的情況下,這三個舍入函數(shù)還是返回相同的值。
    DECLARE @value int
    SET @value = -11
    SELECT ROUND(@value, 1)
    SELECT CEILING(@value)
    SELECT FLOOR(@value)
    -11
    -11
    -11
    要證明整數(shù)這個觀點(diǎn),四舍五入是不可能的。讓我們來看看一些其他的數(shù)據(jù)類型。
    DECLARE @value int
    SET @value = -11.5
    SELECT ROUND(@value, 2)
    SELECT CEILING(@value)
    SELECT FLOOR(@value)
    -11
    -11
    -11
    在我們的例子中,用一個小數(shù)數(shù)據(jù)類型和不同長度參數(shù)(比如1,2或者3)的舍入函數(shù)會產(chǎn)生不同的終值。當(dāng)四舍五入這個值并且長度參數(shù)是1時,小數(shù)點(diǎn)后第二位的5是有意義的。另外,在小數(shù)數(shù)據(jù)類型中,CEILING和 FLOOR函數(shù)也會考慮小數(shù)位,因?yàn)闀玫讲煌闹怠?BR>    DECLARE @value decimal(10,2)
    SET @value = 11.05
    SELECT ROUND(@value, 1)
    SELECT ROUND(@value, 2)
    SELECT ROUND(@value, 3)
    SELECT CEILING(@value)
    SELECT FLOOR(@value)
    11.10
    11.05
    11.05
    12
    11
    如同上面的例子,基于不同的長度參數(shù),小數(shù)點(diǎn)后第二位的6是有意義的。
    DECLARE @value decimal(10,2)
    SET @value = -14.46
    SELECT ROUND(@value, 1)
    SELECT ROUND(@value, 2)
    SELECT ROUND(@value, 3)
    SELECT CEILING(@value)
    SELECT FLOOR(@value)
    -14.50
    -14.46
    -14.46
    -14
    -15
    這個例子也有助于描述四舍五入值的破壞。這個例子也證明了CEILING和 FLOOR 函數(shù)四舍五入成最近的函數(shù)。
    DECLARE @value decimal(10,10)
    SET @value = .5432167890
    SELECT ROUND(@value, 1)
    SELECT ROUND(@value, 2)
    SELECT ROUND(@value, 3)
    SELECT ROUND(@value, 4)
    SELECT ROUND(@value, 5)
    SELECT ROUND(@value, 6)
    SELECT ROUND(@value, 7)
    SELECT ROUND(@value, 8)
    SELECT ROUND(@value, 9)
    SELECT ROUND(@value, 10)
    SELECT CEILING(@value)
    SELECT FLOOR(@value)
    0.5000000000
    0.5400000000
    0.5430000000
    0.5432000000
    0.5432200000
    0.5432170000
    0.5432168000
    0.5432167900
    0.5432167890
    0.5432167890
    1
    0
    在最后的例子中,你可以看到在浮點(diǎn)數(shù)據(jù)類型里采取與上面小數(shù)點(diǎn)的例子相同類型的行為。另外,CEILING和FLOOR函數(shù)四舍五入成最近的函數(shù)。
    DECLARE @value float(10)
    SET @value = .1234567890
    SELECT ROUND(@value, 1)
    SELECT ROUND(@value, 2)
    SELECT ROUND(@value, 3)
    SELECT ROUND(@value, 4)
    SELECT ROUND(@value, 5)
    SELECT ROUND(@value, 6)
    SELECT ROUND(@value, 7)
    SELECT ROUND(@value, 8)
    SELECT ROUND(@value, 9)
    SELECT ROUND(@value, 10)
    SELECT CEILING(@value)
    SELECT FLOOR(@value)
    0.1
    0.12
    0.123
    0.1235
    0.12346
    0.123457
    0.1234568
    0.12345679
    0.123456791
    0.123456791
    1
    0