SQL 中详解round(),floor(),ceiling()函数的用法和区别?

原创 2013年06月09日 14:00:21
 
摘自:http://blog.csdn.net/yueliangge910101/article/details/9064021
          应用中使用四舍五入的值,我和我的用户在报表应用中的计算问题存在分歧。所有的代码都在T-SQL中,但是我认为报表问题与数据类型和向下取整或向上取整规则关系密切。请问您有没有这方面的高见?我想看到一些带有不同编码选项的例子。
   Examda提示:如果不理解基本的数据类型和四舍五入函数,那么你就可能误解四舍五入。由于数据类型的差异(比如integer,float, decimal等等),四舍五入后的值可能会不同。另外,由于在计算中使用的SQL Server舍入函数(ROUND(),CEILING(),FLOOR())的差异,得到的结果值也可能会不同。因此,找到用户对四舍五入的要求接着把这些要求转化到适当的T-SQL命令中是很重要的。
   让我们先从定义的角度开始:
   ROUND() – 四舍五入一个正数或者负数,结果为一定长度的值。
   CEILING() - 返回最小的整数,使这个整数大于或等于指定数的数值运算。
   FLOOR() - 返回最大整数,使这个整数小于或等于指定数的数值运算。
   让我们来看看有不同数据类型的函数的结果。 
ROUND(),CEILING()和FLOOR()例子

例子

在这个例子中,你可以看到,在一个正整数的情况下,这三个舍入函数返回相同的值。

DECLARE @value int
SET @value = 6

SELECT ROUND(@value, 1) 6
SELECT CEILING(@value) 6
SELECT FLOOR(@value) 6

在第二个例子中,即使在一个负整数的情况下,这三个舍入函数还是返回相同的值。

DECLARE @value int
SET @value = -11

SELECT ROUND(@value, 1) -11
SELECT CEILING(@value) -11
SELECT FLOOR(@value) -11

要证明整数这个观点,四舍五入是不可能的。让我们来看看一些其他的数据类型。

DECLARE @value int
SET @value = -11.5

SELECT ROUND(@value, 2) -11
SELECT CEILING(@value) -11 
SELECT FLOOR(@value) -11

在我们的例子中,用一个小数数据类型和不同长度参数(比如1,2或者3)的舍入函数会产生不同的终值。当四舍五入这个值并且长度参数是1时,小数点后第二位的5是有意义的。另外,在小数数据类型中,CEILING和 FLOOR函数也会考虑小数位,因为会得到不同的值。

DECLARE @value decimal(10,2)
SET @value = 11.05

SELECT ROUND(@value, 1) 11.10
SELECT ROUND(@value, 2) 11.05
SELECT ROUND(@value, 3) 11.05
SELECT CEILING(@value) 12
SELECT FLOOR(@value) 11

如同上面的例子,基于不同的长度参数,小数点后第二位的6是有意义的。

DECLARE @value decimal(10,2)
SET @value = -14.46

SELECT ROUND(@value, 1) -14.50
SELECT ROUND(@value, 2) -14.46
SELECT ROUND(@value, 3) -14.46
SELECT CEILING(@value) -14
SELECT FLOOR(@value) -15

这个例子也有助于描述四舍五入值的破坏。这个例子也证明了CEILING和 FLOOR 函数四舍五入成最近的函数。

DECLARE @value decimal(10,10)
SET @value = .5432167890

SELECT ROUND(@value, 1) 0.5000000000 
SELECT ROUND(@value, 2) 0.5400000000
SELECT ROUND(@value, 3) 0.5430000000
SELECT ROUND(@value, 4) 0.5432000000
SELECT ROUND(@value, 5) 0.5432200000
SELECT ROUND(@value, 6) 0.5432170000
SELECT ROUND(@value, 7) 0.5432168000
SELECT ROUND(@value, 8) 0.5432167900
SELECT ROUND(@value, 9) 0.5432167890
SELECT ROUND(@value, 10) 0.5432167890
SELECT CEILING(@value) 1
SELECT FLOOR(@value) 0

在最后的例子中,你可以看到在浮点数据类型里采取与上面小数点的例子相同类型的行为。另外,CEILING和FLOOR函数四舍五入成最近的函数。

DECLARE @value float(10)
SET @value = .1234567890

SELECT ROUND(@value, 1) 0.1
SELECT ROUND(@value, 2) 0.12
SELECT ROUND(@value, 3) 0.123
SELECT ROUND(@value, 4) 0.1235
SELECT ROUND(@value, 5) 0.12346
SELECT ROUND(@value, 6) 0.123457
SELECT ROUND(@value, 7) 0.1234568
SELECT ROUND(@value, 8) 0.12345679
SELECT ROUND(@value, 9) 0.123456791
SELECT ROUND(@value, 10) 0.123456791
SELECT CEILING(@value) 1
SELECT FLOOR(@value) 0

SQL 中详解round(),floor(),ceiling()函数的用法和区别?的更多相关文章

  1. sql中详解round(),floor(),ceiling()函数的用法和区别?

    round() 遵循四舍五入把原值转化为指定小数位数,如:round(1.45,0) = 1;round(1.55,0)=2floor()向下舍入为指定小数位数 如:floor(1.45,0)= 1; ...

  2. SQL中Round(),Floor(),Ceiling()函数的浅析

    项目中的一个功能模块上用到了标量值函数,函数中又有ceiling()函数的用法,自己找了一些资料,对SQL中这几个函数做一个简单的记录,方便自己学习.有不足之处欢迎拍砖补充 1.round()函数遵循 ...

  3. pandas常用操作详解——.loc与.iloc函数的使用及区别

    loc与iloc功能介绍:数据切片.通过索引来提取数据集中相应的行数据or列数据(可以是多行or多列) 总结: 不同:1. loc函数通过调用index名称的具体值来取数据2. iloc函数通过行序号 ...

  4. java中+=详解 a+=b和a=a+b的区别

    short a=10; a+=4; System.out.println(a); 1.第一段代码的输出结果为14.执行流程是首先声明变量,判断赋给变量的初始值是否在short类型范围内,如果在则进行强 ...

  5. JavaScript中的bind,call和apply函数的用法和区别

    一直没怎么使用过JavaScript中的bind,call和apply, 今天看到一篇比较好的文章,觉得讲的比较透彻,所以记录和总结如下 首先要理解的第一个概念,JavaScript中函数调用的方式, ...

  6. Elasticsearch SQL用法详解

    Elasticsearch SQL用法详解  mp.weixin.qq.com 本文详细介绍了不同版本中Elasticsearch SQL的使用方法,总结了实际中常用的方法和操作,并给出了几个具体例子 ...

  7. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  8. Hadoop Hive sql语法详解

    Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...

  9. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

随机推荐

  1. 【.net】获取网页CDM的下载链接的地址

    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...

  2. 【转】通过xml处理sql语句时对小于号与大于号的处理转换

    当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...

  3. H3C SNMP OID

    有两种mib-style [1]老些的设备 cpu 使用率OID: .1.3.6.1.4.1.25506.2.6.1.1.1.1.6.slot  内存使用率OID: .1.3.6.1.4.1.2550 ...

  4. Python单元测试unittest - 单元测试框架

    一.unittest简介 unitest单元测试框架最初是有JUnit的启发,它支持测试自动化,共享测试的设置和关闭代码,将测试聚合到集合中,以及测试与报告框架的独立性. 二.unittest相关概念 ...

  5. pom.xml的第一行报错

    第一行:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or ...

  6. saltstack自动化运维系列①之saltstack服务安装及简单使用

    Saltstack介绍 Salt三种运行方式 1.local本地运行2.Master/Minion3.Salt ssh Salt的三大功能 a.远程执行b.配置管理(状态管理)c.云管理:阿里云,aw ...

  7. Yahoo的Yslow23条规则

    一. CONTENT 减少使用HTTP请求(Minimize HTTP Requests) 通常打开一个页面的时候,大部分的时间都是在下载该页面的图片,css样式,js脚本,flash等等资源,减少这 ...

  8. python 全栈开发,Day65(索引)

    索引 一.索引的介绍 数据库中专门用于帮助用户快速查找数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置吗,然后直接获取. 二 .索引的作用 约束和加速查找 三.常 ...

  9. 获取更新元素文本text()

    text() 方法,获取元素文本,也可以设置元素的文本值.相 <!DOCTYPE html> <html lang="en"> <head> & ...

  10. jQuery+存储过程实现无刷新分页(九)

    涉及到得知识点: 1.分页存储过程 2.分页原理 3.jQuery DOM操作 4.jQuery Ajax存取数据   效果图: