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. Latex 公式居中

    这么简单的功能要是还要加工具包,LaTeX也不用混了~ 公式用\[...\]来写可以达到公式居中效果. 或者在equation环境外加center环境: \begin{center} \begin{e ...

  2. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之存储模型

    1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性   2. 存储系统体系结构 2.1.    地址空间 指令地址空间溢出 指令地址计算((address_of ...

  3. XmlDocument根据节点的属性值获取节点

    string targetParm = string.Format("STUDENTS/STUDENT[@NO='{0}']", targetValue);//生成目标获取节点的参 ...

  4. 升级tomcat需要更改哪些配置?

    1.上传Tomcatapache-tomcat-7.0.84.zip将38服务器上的Tomcat传到107服务器指定目录:scp /data/apache-tomcat-7.0.84.zip jsdx ...

  5. jenkins findbugs流编码问题:DM_DEFAULT_ENCODING

    报错信息: MessageParserUtil.java:122, DM_DEFAULT_ENCODING, Priority: High Dm: Found reliance on default ...

  6. 一步步实现windows版ijkplayer系列文章之五——使用automake生成makefile

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  7. Android通讯:通话

    Android通讯之通话功能的实现: 在Android中,android.telephony.TelephonyManager对象是开发者获取当前通话网络相关信息的窗口,通过TelephonyMana ...

  8. Go语言规格说明书 之 结构体类型(Struct types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  9. python安装虚拟环境pipenv

    python里如果多个多个项目同时引用包,就会涉及到包版本的问题,包不同版本管理的问题可以用虚拟环境来管理, 创建虚拟环境,这里是用官方推荐的pipenv来创建 先用pip命令行安装pipenv pi ...

  10. LeetCode(2):Add Two Numbers 两数相加

    Medium! 题目描述: 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头 ...