2019独角兽企业重金招聘Python工程师标准>>>

“四舍五入”是我们最早接触的数学概念之一。我们日常开发系统中,数字取整也是我们最常接触的一种需求样式。在财务相关系统中,四舍五入的算法有时候对系统用户造成巨大的影响。

在Oracle SQL中,提供了四种数字取整函数。从名称上,他们都是在取整,但是具体算法有所不同。在本篇里面,我们进行一下详细的分析。

1、环境介绍和准备

我们依然选择Oracle 11gR2版本进行测试。

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0  Production

不同种类数据进行测试。

SQL> create table t (id number);

Table created

SQL> select * from t;

ID

----------

0

1

1.3

1.5

1.8

-1

-1.3

-1.5

-1.8

9 rows selected

2、四种基本取整函数

Oracle中的四种有取证功能函数为:ceil、floor、trunc和round,每一个都有不同的含义和特点,适合不同的场景。

Ceil的原始含义是说:返回比当前值大的第一个整数。这里要注意“大”的概念,最简单的理解就是我们数学上的数轴。Ceil就是返回当前值在数轴往右第一个整数值。

SQL> select id, ceil(id) from t;

ID   CEIL(ID)

---------- ----------

0          0

1          1

1.3          2

1.5          2

1.8          2

-1         -1

-1.3         -1

-1.5         -1

-1.8         -1

9 rows selected

这里主要注意负数的ceil结果,和我们直观的想法有一些差异。而且ceil并没有进行四舍五入。

Floor与ceil相对应,应该说是正好相反。ceil取定数轴右侧的第一个整数值。而Floor取定的是数轴左侧的第一个整数值,也就是取小的动作。

SQL> select id, floor(id) from t;

ID  FLOOR(ID)

---------- ----------

0          0

1          1

1.3          1

1.5          1

1.8          1

-1         -1

-1.3         -2

-1.5         -2

-1.8         -2

9 rows selected

floor作用是找比当前值小的整数。

trunc是一个“多功能”函数。我们已经习惯其对date日期类型的处理方式。trunc输入参数是日期类型时,起到的是裁断天之后的时分秒信息。全部如期转为00:00:00。但trunc面对数字类型输入的时候,也会将小数点后面的数字截取。

SQL> select id, trunc(id) from t;

ID  TRUNC(ID)

---------- ----------

0          0

1          1

1.3          1

1.5          1

1.8          1

-1         -1

-1.3         -1

-1.5         -1

-1.8         -1

9 rows selected

trunc对数字也没有“四舍五入”的概念,都是直接“截断处理”。严格的说,只有round才算真正有“四舍五入”的选择动作。

SQL> select id, round(id) from t;

ID  ROUND(ID)

---------- ----------

0          0

1          1

1.3          1

1.5          2

1.8          2

-1         -1

-1.3         -1

-1.5         -2

-1.8         -2

9 rows selected

只有round才有我们通常意义的四舍五入动作。

3、取整函数的精度scale取值

我们这些取整函数,一些可以带一个可选参数,用来表示设置精度。当前我们数据为状态如下:

SQL> select * from t;

ID

----------

1234.4345

1234.4392

-1234.4392

-1234.4345

trunc和round是可以支持函数scale参数的。

SQL> select id, trunc(id,1), round(id,1) from t;

ID TRUNC(ID,1) ROUND(ID,1)

---------- ----------- -----------

1234.4345      1234.4      1234.4

1234.4392      1234.4      1234.4

-1234.4392     -1234.4     -1234.4

-1234.4345     -1234.4     -1234.4

如果设置正数,那么返回的小数点后面的位数进行处理。如果我们设置负数呢?

SQL> select id, trunc(id,-1), round(id,-1) from t;

ID TRUNC(ID,-1) ROUND(ID,-1)

---------- ------------ ------------

1234.4345         1230         1230

1234.4392         1230         1230

-1234.4392        -1230        -1230

-1234.4345        -1230        -1230

如果设置负数,就在小数点前面进行截取操作。同时,floor和ceil不支持第二个参数。

SQL> select id, ceil(id,1), floor(id,1) from t;

select id, ceil(id,1), floor(id,1) from t

ORA-00909: 参数个数无效

SQL> select id, floor(id,1) from t;

select id, floor(id,1) from t

ORA-00909: 参数个数无效

4、mod与remainder

mod取余数,我们经常用的“模”操作就是基于mod的操作。而remainder的功能也是取余数,两者有什么差别呢?

SQL> select mod(11,4), remainder(11,4) from dual;

MOD(11,4) REMAINDER(11,4)

---------- ---------------

3              -1

SQL> select mod(0,4), remainder(0,4) from dual;

MOD(0,4) REMAINDER(0,4)

---------- --------------

0              0

SQL> select mod(-11,4), remainder(-11,4) from dual;

MOD(-11,4) REMAINDER(-11,4)

---------- ----------------

-3                1

当取余操作的两个参数都是整数的时候,我们基本看出什么问题。但是一旦出现负数,无论是除数还是被除数,mod的行为和经典余数模型有一些不同。

SQL> select mod(-11,-4), remainder(-11,-4) from dual;

MOD(-11,-4) REMAINDER(-11,-4)

----------- -----------------

-3                 1

SQL> select mod(11,-4), remainder(11,-4) from dual;

MOD(11,-4) REMAINDER(11,-4)

---------- ----------------

3               -1

精确的说,mod的函数取值为:n2-n1*floor(n2/n1)。所以,要注意在存在负数的时候,mod的问题。

remainder也有取余的效果,那么有什么不同的?要点就在计算公式的floor上面。对remainder而言,Oracle没有选择floor,而是round四舍五入。

5、结论

Oracle提供了很多自定义函数,用好他们、用对他们,可以给予我们很大帮助。

转载于:https://my.oschina.net/u/1579617/blog/394595

聊聊四种Oracle数字取整函数相关推荐

  1. oracle取_后的数字,聊聊四种Oracle数字取整函数

    "四舍五入"是我们最早接触的数学概念之一.我们日常开发系统中,数字取整也是我们最常接触的一种需求样式.在财务相关系统中,四舍五入的算法有时候对系统用户造成巨大的影响. 在Oracl ...

  2. Oracle的取整函数

    作者:iamlaosong oracle涉及到取整的函数主要有4个,两个单参数的(ceil和floor),两个双参数的(trunc和round).双参数不仅可以取整,也可以取到任一位小数,甚至可以取到 ...

  3. C# 爬虫 正则、NSoup、HtmlAgilityPack、Jumony四种方式抓取小说

    心血来潮,想爬点小说.通过百度选择了个小说网站,随便找了一本小说http://www.23us.so/files/article/html/13/13655/index.html. 1.分析html规 ...

  4. Oracle的取整和四舍五入函数——floor,round,ceil,trunc使用说明

    oracle的取整和四舍五入函数--floor  round  ceil  trunc使用说明 看了electrictoolbox上对PHP,MYSQL,Javascript几种语言关于取整数的专题, ...

  5. matlab 四种取整函数(fix floor ceil round)的区别

    Matlab取整函数有: fix, floor, ceil, round四种,具体使用方法如下: (1) fix 朝零方向取整 如 fix(-1.3)=-1 fix(1.3)=1; (2) floor ...

  6. matlab中的四种取整函数的使用(fix, floor, ceil, round)

    (1)fix(x) : 截尾取整. >> fix( [3.12 -3.12]) ans = 3    -3 (2)floor(x):不超过x 的最大整数.(高斯取整) >> f ...

  7. java存储整数,用于存储整数数值的是 JAVA四种整数数据类型的取值范围分别是多少...

    JAVA四种整数数据类型的取值范围分别是多少 byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1) short的取值范围为-32768~32767,占用2个字节(-2的1 ...

  8. C++/python描述 898. 数字三角形 (四种实现方法)

    C++/python描述 898. 数字三角形 (四种实现方法)   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写 ...

  9. 用python爬取基金网信息数据,保存到表格,并做成四种简单可视化。(爬虫之路,永无止境!)

    用python爬取基金网信息数据,保存到表格,并做成四种简单可视化.(爬虫之路,永无止境!) 上次 2021-07-07写的用python爬取腾讯招聘网岗位信息保存到表格,并做成简单可视化. 有的人留 ...

最新文章

  1. pl sql如何调试oracle存储过程,PL/SQL Developer中调试oracle的存储过程
  2. 自己写的程序发给别人老是会出现缺失各种库,而自己电脑运行却没毛病
  3. excel里面如果有filter就不能直接sum,要复制转换一下
  4. web浏览器_vs2019使用webview2开发web浏览器 - 左正
  5. iOS 13 真机调试包
  6. Java 读写 hdfs文件或者目录
  7. php中的$_server,细说PHP中的$_SERVER
  8. org.hibernate.service.ServiceRegistryBuilder被弃用
  9. 怎么扩展磁盘_电脑怎么增加C盘空间 小白教你不花钱增加C盘空间
  10. sql子句的执行顺序_SQL Server查询执行计划– WHERE子句的示例
  11. [VSCode] 设置 pylint 以解决 Module ‘torch‘ has no ‘xxx‘ member
  12. wamp3.1.0下载地址
  13. 46张PPT彻底弄懂JVM、GC算法和性能调优!
  14. android studio中tabhost自定义,Android Studio——TabWiget组件实现(带图标签)
  15. C语言中求大于M10个最大素数,全国计算机二级C语言上机题库—南开100题
  16. 读书-高性能MySQL 第三章
  17. CSS3时光流逝效果
  18. 【scipy】scipy.linalg.slove 求解线性方程组 python
  19. 恒天然NZMP品牌干酪在2018年国际奶酪大赛中荣获八枚奖牌
  20. 最新 全球 ip地址 归属地 字典表 (202108)

热门文章

  1. HTML Img(Type)
  2. c语言能让制表符空9个字符码,C语言入门9-1-分类函数
  3. 3002基于二叉链表的树结构相等的判断(附WA的可能情况)
  4. 多路平衡归并和败者树
  5. oracle 视图及函数授权,Oracle常见1000问之内部函数及管理视图
  6. Cracer8-模块和正则表达式
  7. 299 Bulls and Cows 猜数字游戏
  8. 黄学长模拟day1 球的序列
  9. T-SQL远程数据库备份还原
  10. 【转】zookeeper 的监控工具