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. shiro自定义realm认证(五)

    上一节介绍了realm的作用: realm:需要根据token中的身份信息去查询数据库(入门程序使用ini配置文件),如果查到用户返回认证信息,如果查询不到返回null.token就相当于是对用户输入 ...

  2. linux 网卡

    查看网卡UUID:nmcli con show    或    nmcli con list 查看网卡mac地址:nmcli dev show    或    nmcli dev list 注:sho ...

  3. Jetson tk1 安装 Intel 7260 无线网卡驱动

    Jseton TK1上没有集成的无线网卡,开发板上有一个mini pci-e接口,可以插入Intel 7260这款继承了wifi和蓝牙功能的无线网卡: 该网卡实物如下图,在淘宝和Amazon上都可以买 ...

  4. Simulink--MATLAB中的一种可视化仿真工具

     Simulink是MATLAB中的一种可视化仿真工具, 是一种基于MATLAB的框图设计环境,是实现动态系统建模.仿真和分析的一个软件包,被广泛应用于线性系统.非线性系统.数字控制及数字信号处理的建 ...

  5. python 生成器与协程

    生成器在迭代中以某种方式生成下一个值并且返回和next()调用一样的东西. 挂起返回出中间值并多次继续的协同程序被称作生成器. 语法上讲,生成器是一个带yield语句的函数.一个函数或者子程序只返回一 ...

  6. java.util.Map

    map时key/value形式存储信息的,键可以为对象null public static void main(String[] args) { Map<String, String> m ...

  7. androidpn 推送系统

    (文中部分内容来自网络,如无意中侵犯了版权,请告之!) XMPP协议: XMPP : The Extensible Messaging andPresence Protocol. 中文全称:可扩展通讯 ...

  8. Nodejs实现WebSocket通信demo

    一.创建websocket.js文件 步骤: 1.创建websocket.js文件,复制如下代码: 2.安装nodejs-websocket依赖: 3.该文件夹下命令行执行 node websocke ...

  9. kmp算法专题总结

    next数组的含义:next[i]表示以字符串s的第i个字符为结尾的后缀与s前缀匹配的长度 next数组也可以当做fail数组,即当模式串s[j]与串t[i]不匹配时,只要将j转换到next[j]继续 ...

  10. cf1020c 瞎搞

    枚举获胜状态即可 #include<iostream> #include<cstdio> #include<cstring> #include<cmath&g ...