SQL Server中的Rounding函数
2008-10-08 10:08:18 来源:WEB开发网核心提示:问题 最近我试着在自己的应用中使用四舍五入的值,我和我的用户在报表应用中的计算问题存在分歧,SQL Server中的Rounding函数,所有的代码都在T-SQL中,但是我认为报表问题与数据类型和向下取整或向上取整规则关系密切,你可以看到在浮点数据类型里采取与上面小数点的例子相同类型的行为,另外,请问您有没有这方面的高
问题
最近我试着在自己的应用中使用四舍五入的值,我和我的用户在报表应用中的计算问题存在分歧。所有的代码都在T-SQL中,但是我认为报表问题与数据类型和向下取整或向上取整规则关系密切。请问您有没有这方面的高见?我想看到一些带有不同编码选项的例子。
专家解答
如果不理解基本的数据类型和四舍五入函数,那么你就可能误解四舍五入。由于数据类型的差异(比如integer,float, decimal等等),四舍五入后的值可能会不同。另外,由于在计算中使用的SQL Server舍入函数(ROUND(),CEILING(),FLOOR())的差异,得到的结果值也可能会不同。因此,找到用户对四舍五入的要求接着把这些要求转化到适当的T-SQL命令中是很重要的。
让我们先从定义的角度开始:
l ROUND() – 四舍五入一个正数或者负数,结果为一定长度的值。
l CEILING() - 返回最小的整数,使这个整数大于或等于指定数的数值运算。
l FLOOR() - 返回最大整数,使这个整数小于或等于指定数的数值运算。
让我们来看看有不同数据类型的函数的结果。
ROUND(),CEILING()和FLOOR()例子 | |
例子 | 值 |
在这个例子中,你可以看到,在一个正整数的情况下,这三个舍入函数返回相同的值。 | |
DECLARE @value intSET @value = 6SELECT ROUND(@value, 1)SELECT CEILING(@value)SELECT FLOOR(@value) | 666 |
在第二个例子中,即使在一个负整数的情况下,这三个舍入函数还是返回相同的值。 | |
DECLARE @value intSET @value = -11SELECT ROUND(@value, 1)SELECT CEILING(@value)SELECT FLOOR(@value) | -11-11-11 |
要证明整数这个观点,四舍五入是不可能的。让我们来看看一些其他的数据类型。 | |
DECLARE @value intSET @value = -11.5SELECT 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.05SELECT ROUND(@value, 1)SELECT ROUND(@value, 2)SELECT ROUND(@value, 3)SELECT CEILING(@value)SELECT FLOOR(@value) | 11.1011.0511.051211 |
如同上面的例子,基于不同的长度参数,小数点后第二位的6是有意义的。 | |
DECLARE @value decimal(10,2)SET @value = -14.46SELECT 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 = .5432167890SELECT 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.50000000000.54000000000.54300000000.54320000000.54322000000.54321700000.54321680000.54321679000.54321678900.543216789010 |
在最后的例子中,你可以看到在浮点数据类型里采取与上面小数点的例子相同类型的行为。另外,CEILING和FLOOR函数四舍五入成最近的函数。 | |
DECLARE @value float(10)SET @value = .1234567890SELECT 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.10.120.1230.12350.123460.1234570.12345680.123456790.1234567910.12345679110 |
- ››SQL Server 2008 R2 下如何清理数据库日志文件
- ››sqlite 存取中文的解决方法
- ››SQL2005、2008、2000 清空删除日志
- ››SQL Server 2005和SQL Server 2000数据的相互导入...
- ››sql server 2008 在安装了活动目录以后无法启动服...
- ››sqlserver 每30分自动生成一次
- ››sqlite 数据库 对 BOOL型 数据的插入处理正确用法...
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
更多精彩
赞助商链接