應(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
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