先来看下面SQL执行结果:

select cast(CAST(ROUND(nvl(0.987689,0)*100,2) AS DECIMAL(4,2)) AS STRING) num;
select cast(CAST(ROUND(nvl(0.804889,0)*100,2) AS DECIMAL(4,2)) AS STRING) num;
select round(0.8048892988929889*100,2) num;
select cast(CAST(ROUND(nvl(0.805889,0)*100,2) AS DECIMAL(4,2)) AS STRING) num;
select CAST(ROUND(cast(nvl(0.8038892988929889,0) as DECIMAL(7,5))*100,2) as string) num;
select CAST(ROUND(cast(nvl(0.8048892988929889,0) as DECIMAL(7,5))*100,2) as string) num;

执行结果依次为:

98.77
80.48
80.49
80.59
80.49

注:使用的数据库是impala

有图有真相

问题:

0.987689乘100后(98.7689)保留两位小数,可以四舍五入,结果为:98.77;

0.805889乘100后(80.5889)保留两位小数,可以四舍五入,结果为:80.59;

0.803889乘100后(80.3889)保留两位小数,可以四舍五入,结果为:80.39;

但0.804889乘100后(80.4889)保留两位小数,没有四舍五入,结果为:80.48。

知道了问题,现在分析一下原因:

为什么我们在写sql使用round函数四舍五入时,0.804889乘100后保留两位小数,明明后面是8可以进位反而舍掉了呢?

原因一:

在于“四舍六入五成双”原则(来源于百度百科)
对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:
(1)5前为奇数,舍5入1;
(2)5前为偶数,舍5不进。

我理解的这里的“5”是指代比5大的数字。

上面这些的意思就是:

80.3889这里的8前面是3(奇数),所以舍8入1,就是9;

80.5889这里的8前面是5(奇数),所以舍8入1,就是9;

80.4889这里的8前面是4(偶数),所以舍8不进,还是8;

到这里还没有完,聪明的你会发现:

为什么这两个执行的结果不一致。

原因二:

查看了官方文档的Round函数说明:
For exact-value numbers, ROUND() uses the “round half up” rule(对于精确的数值, ROUND 函数使用四舍五入)
For approximate-value numbers, the result depends on the C library. On many systems, this means that ROUND() uses the “round to nearest even” rule: A value with any fractional part is rounded to the nearest even integer. (对于近似值,则依赖于底层的C函数库,在很多系统中 ROUND 函数会使用“取最近的偶数”的规则)
在计算机的计算领域里,包括JAVA里的double,float都不算是精准的计算类型,一般都用decimal进行精准计算,所以Round的计算就默认的走了第二条规则。

解决方案:
先采用CAST函数,用于将某种数据类型的表达式显式转换为另一种数据类型decimal。然后再ROUND函数。

执行结果如下:

愿你遍历山河 仍觉人间值得

SQL中Round函数没有四舍五入相关推荐

  1. SQL中Round函数没有四舍五入原因及处理方法

    为什么我们在写sql使用round函数四舍五入时,明明后面是5可以进位反而舍掉了那? 原因在于"四舍六入五成双"原则(来源于百度百科) 对于位数很多的近似数,当有效位数确定后,其后 ...

  2. mysql round不四舍五入_MySQL中ROUND函数进行四舍五入操作陷阱分析

    本文实例讲述了MySQL中ROUND函数进行四舍五入操作陷阱.,具体如下: 在MySQL中, ROUND函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本 ...

  3. SQL中round()函数、Ucase()、Lcase()、as的用法

    今天在做round()嵌套使用avg()函数的时候,出现一些小错误:即as的用法有些模糊,导致sql出错.下面先来看看round()函数: 数据库对小数进行四舍五入保留:round(字段名,保留小数位 ...

  4. 【问题解决】python中round()函数并非四舍五入

    对于python中的round()函数,我们简单的认为是四舍五入,其实不然 对于偶数 >>> round(4.5) 4 对于奇数 >>> round(5.5) 6 ...

  5. SQL语句ROUND函数(四舍五入,保留小数位)

    round函数(数据库中可用的函数,Excel也可用) round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果.除数值外,也可对日期进行舍入运算. round(number,di ...

  6. SQL中round()函数的使用

    ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数. SQL ROUND() 语法 SELECT ROUND(column_name,decimals) FROM table_n ...

  7. access四舍五入取整round_access中round函数怎么用

    access中round函数怎么用?access中round函数的用法!下面,小编通过示例来给大家介绍access中round函数的用法. 工具/原料 access 2007 方法/步骤 打开acce ...

  8. sql中len函数_在SQL中使用LEN(),ROUND()函数

    sql中len函数 LEN() and ROUND() are scalar functions which return a single value, based in the input val ...

  9. php ronud_PHP中round()函数对浮点数进行四舍五入的方法

    本文实例讲述了PHP中round()函数对浮点数进行四舍五入的方法.分享给大家供大家参考.具体方法如下: 语法:round(x,prec) 参数 描述 x 可选,规定要舍入的数字. prec 可选,规 ...

最新文章

  1. 【Android应用开发】RecycleView API 翻译 (文档翻译)
  2. 机器学习系列-随机过程
  3. Java 设计模式之观察者模式
  4. SharePoint学习札记[6] — WebPart之基础
  5. Windows下Python的pd.read_excel()报错
  6. 浅谈2011年上半年Java游戏领域动态
  7. winform程序的皮肤问题
  8. python大神作品_Python大神的书单
  9. ImmunityDebugger 学习
  10. Linux内核分析与驱动编程-1
  11. Kali [masscan]端口扫描
  12. ftp服务器vsftpd配置文件,vsftpd配置文件详解及ftp服务器搭建
  13. 2022年 接口测试高频面试题及答案
  14. 笔记本风扇噪音太大,最简单操作风扇降噪
  15. java项目第12期-淘客系统源码(安卓+IOS+java后端)【毕业设计】
  16. Trunk详解(笔记)
  17. 线程池系列三:动态修改线程池队列大小
  18. bd-rate的计算
  19. 网络安全学习第6篇 - 爆破及PE文件解释
  20. Drupal 常用模块汇总

热门文章

  1. 和平分手?你根本不知道吴恩达在百度经历了什么
  2. Go 每日一库之 bytebufferpool
  3. 计算机维修直播,电脑直播过程中出现杂声怎么办?三种解决方法任你选
  4. jd-cloud.cn京东为什么输掉“京东云”域名仲裁案?
  5. 基于JxBrowser的浏览器控件封装实现Java Swing的浏览器集成
  6. 最速下降法/梯度下降法
  7. stm32毕设分享 STM32智能饮水机控制系统(源码+硬件+论文)
  8. 在Spring Boot中配置Thymeleaf的模板路径
  9. 三星发布2亿像素传感器并举办第三届未来技术论坛;福瑞泰克新智能制造工厂在乌镇开工 | 全球TMT...
  10. 404页面跳转到其他页面的安全做法