Welcome

首页 / 数据库 / SQLServer / SQL Server中的Rounding函数

SQL Server中的Rounding函数2010-08-16李恩问题

最近我试着在自己的应用中使用四舍五入的值,我和我的用户在报表应用中的 计算问题存在分歧。所有的代码都在T-SQL中,但是我认为报表问题与数据类型和 向下取整或向上取整规则关系密切。请问您有没有这方面的高见?我想看到一些带 有不同编码选项的例子。

专家解答

如果不理解基本的数据类型和四舍五入函数,那么你就可能误解四舍五入。由 于数据类型的差异(比如integer,float, decimal等等),四舍五入后的值可能 会不同。另外,由于在计算中使用的SQL Server舍入函数(ROUND(),CEILING(), FLOOR())的差异,得到的结果值也可能会不同。因此,找到用户对四舍五入的要 求接着把这些要求转化到适当的T-SQL命令中是很重要的。

让我们先从定义的角度开始:

l ROUND() – 四舍五入一个正数或者负数,结果为一定长度的值。

l CEILING() - 返回最小的整数,使这个整数大于或等于指定数的数值运算。

l FLOOR() - 返回最大整数,使这个整数小于或等于指定数的数值运算。

让我们来看看有不同数据类型的函数的结果。

ROUND(),CEILING()和FLOOR()例子
例子
在这个例子中,你可以看到,在一个正整数的情 况下,这三个舍入函数返回相同的值。
DECLARE @value int SET @value = 6 SELECT ROUND(@value, 1) SELECT CEILING(@value) SELECT FLOOR(@value)6 6 6
在第二个例子中,即使在一个负整数的情况下, 这三个舍入函数还是返回相同的值。
DECLARE @value int SET @value = -11 SELECT ROUND(@value, 1) SELECT CEILING(@value) SELECT FLOOR(@value)-11 -11 -11
要证明整数这个观点,四舍五入是不可能的。让 我们来看看一些其他的数据类型。
DECLARE @value int SET @value = -11.5 SELECT ROUND(@value, 2) SELECT CEILING(@value) SELECT FLOOR(@value)-11 -11 -11
在我们的例子中,用一个小数数据类型和不同长 度参数(比如1,2或者3)的舍入函数会产生不同的终值。当四舍五入这个值并且 长度参数是1时,小数点后第二位的5是有意义的。另外,在小数数据类型中, CEILING和 FLOOR函数也会考虑小数位,因为会得到不同的值。
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
如同上面的例子,基于不同的长度参数,小数点 后第二位的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 函数四舍五入成最近的函数。
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
在最后的例子中,你可以看到在浮点数据类型里 采取与上面小数点的例子相同类型的行为。另外,CEILING和FLOOR函数四舍五入 成最近的函数。
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