SQL中Round函数没有四舍五入
先来看下面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函数没有四舍五入相关推荐
- SQL中Round函数没有四舍五入原因及处理方法
为什么我们在写sql使用round函数四舍五入时,明明后面是5可以进位反而舍掉了那? 原因在于"四舍六入五成双"原则(来源于百度百科) 对于位数很多的近似数,当有效位数确定后,其后 ...
- mysql round不四舍五入_MySQL中ROUND函数进行四舍五入操作陷阱分析
本文实例讲述了MySQL中ROUND函数进行四舍五入操作陷阱.,具体如下: 在MySQL中, ROUND函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本 ...
- SQL中round()函数、Ucase()、Lcase()、as的用法
今天在做round()嵌套使用avg()函数的时候,出现一些小错误:即as的用法有些模糊,导致sql出错.下面先来看看round()函数: 数据库对小数进行四舍五入保留:round(字段名,保留小数位 ...
- 【问题解决】python中round()函数并非四舍五入
对于python中的round()函数,我们简单的认为是四舍五入,其实不然 对于偶数 >>> round(4.5) 4 对于奇数 >>> round(5.5) 6 ...
- SQL语句ROUND函数(四舍五入,保留小数位)
round函数(数据库中可用的函数,Excel也可用) round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果.除数值外,也可对日期进行舍入运算. round(number,di ...
- SQL中round()函数的使用
ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数. SQL ROUND() 语法 SELECT ROUND(column_name,decimals) FROM table_n ...
- access四舍五入取整round_access中round函数怎么用
access中round函数怎么用?access中round函数的用法!下面,小编通过示例来给大家介绍access中round函数的用法. 工具/原料 access 2007 方法/步骤 打开acce ...
- sql中len函数_在SQL中使用LEN(),ROUND()函数
sql中len函数 LEN() and ROUND() are scalar functions which return a single value, based in the input val ...
- php ronud_PHP中round()函数对浮点数进行四舍五入的方法
本文实例讲述了PHP中round()函数对浮点数进行四舍五入的方法.分享给大家供大家参考.具体方法如下: 语法:round(x,prec) 参数 描述 x 可选,规定要舍入的数字. prec 可选,规 ...
最新文章
- 【Android应用开发】RecycleView API 翻译 (文档翻译)
- 机器学习系列-随机过程
- Java 设计模式之观察者模式
- SharePoint学习札记[6] — WebPart之基础
- Windows下Python的pd.read_excel()报错
- 浅谈2011年上半年Java游戏领域动态
- winform程序的皮肤问题
- python大神作品_Python大神的书单
- ImmunityDebugger 学习
- Linux内核分析与驱动编程-1
- Kali [masscan]端口扫描
- ftp服务器vsftpd配置文件,vsftpd配置文件详解及ftp服务器搭建
- 2022年 接口测试高频面试题及答案
- 笔记本风扇噪音太大,最简单操作风扇降噪
- java项目第12期-淘客系统源码(安卓+IOS+java后端)【毕业设计】
- Trunk详解(笔记)
- 线程池系列三:动态修改线程池队列大小
- bd-rate的计算
- 网络安全学习第6篇 - 爆破及PE文件解释
- Drupal 常用模块汇总
热门文章
- 和平分手?你根本不知道吴恩达在百度经历了什么
- Go 每日一库之 bytebufferpool
- 计算机维修直播,电脑直播过程中出现杂声怎么办?三种解决方法任你选
- jd-cloud.cn京东为什么输掉“京东云”域名仲裁案?
- 基于JxBrowser的浏览器控件封装实现Java Swing的浏览器集成
- 最速下降法/梯度下降法
- stm32毕设分享 STM32智能饮水机控制系统(源码+硬件+论文)
- 在Spring Boot中配置Thymeleaf的模板路径
- 三星发布2亿像素传感器并举办第三届未来技术论坛;福瑞泰克新智能制造工厂在乌镇开工 | 全球TMT...
- 404页面跳转到其他页面的安全做法