·天新网首页·加入收藏·设为首页·网站导航
数码笔记本手机摄像机相机MP3MP4GPS
硬件台式机网络服务器主板CPU硬盘显卡
办公投影打印传真
家电电视影院空调
游戏网游单机动漫
汽车新车购车试驾
下载驱动源码
学院开发设计
考试公务员高考考研
业界互联网通信探索
SQLServer中的Rounding函数
http://www.21tx.com 2008年12月05日
应用中使用四舍五入的值,我和我的用户在报表应用中的计算问题存在分歧。所有的代码都在T-SQL中,但是我认为报表问题与数据类型和向下取整或向上取整规则关系密切。请问您有没有这方面的高见?我想看到一些带有不同编码选项的例子。
  Examda提示:如果不理解基本的数据类型和四舍五入函数,那么你就可能误解四舍五入。由于数据类型的差异(比如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

上一篇: DHCP服务器无法获取IP地址问题解决实录
下一篇: IP网络测试技术与方法探讨

关于我们 | 联系我们 | 加入我们 | 广告服务 | 投诉意见 | 网站导航
Copyright © 2000-2011 21tx.com, All Rights Reserved.
晨新科技 版权所有 Created by TXSite.net