在MySQL中, ROUND 函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本文将这一问题记录下来,以免大家跟我一样犯同样的错误。

问题描述

假如我们有如下一个数据表 test ,建表语句如下

CREATETABLEtest (idint(11) NOT NULL AUTO_INCREMENT,field1bigint(10) DEFAULT NULL,field2decimal(10,0) DEFAULT NULL,field3int(10) DEFAULT NULL,field4float(15,4) DEFAULT NULL,field5float(15,4) DEFAULT NULL,field6float(15,4) DEFAULT NULL,PRIMARYKEY (id)
) ENGINE=InnoDBDEFAULT CHARSET=utf8;

我们创建了一个名为 test 的表,出了 id 字段之外还包含了多个字段,拥有这不同的数据类型。我们向这个表中插入一条数据

INSERTINTOtest (field1, field2, field3, field4, field5, field6) VALUE (100, 100, 100, 1.005, 3.5, 2.5);

插入之后表中的数据是这样的

mysql> select * fromtest;
+----+--------+--------+--------+--------+--------+--------+
| id | field1 | field2 | field3 | field4 | field5 | field6 |
+----+--------+--------+--------+--------+--------+--------+
|  1 |    100 |    100 |    100 | 1.0050 | 3.5000 | 2.5000 |
+----+--------+--------+--------+--------+--------+--------+
1 rowin set (0.00 sec)

如果现在我们执行下面这个SQL,你觉得结果会是什么样的呢?

SELECTround(field1 * field4),round(field2 * field4),round(field3 * field4),round(field1 * 1.005),round(field2 * 1.005),round(field3 * 1.005),round(field5),round(field6)
FROMtest;

最初一直以为这样的结果肯定是都是 101 ,因为上面这六个取值结果都是对 100 * 1.005 进行四舍五入,结果肯定都是 101 才对,而后面两个肯定是 4 和 3 才对,但是最终的结果却是与设想的大相径庭

*************************** 1. row ***************************
round(field1 * field4): 100
round(field2 * field4): 100
round(field3 * field4): 100round(field1 * 1.005): 101round(field2 * 1.005): 101round(field3 * 1.005): 101round(field5): 4round(field6): 2
1 rowin set (0.00 sec)

为什么会这样?

同样是100*1.005,为什么从数据库中的字段相乘得到的结果和直接字段与小数相乘得到的不一样呢?

对这个问题百思不得其解,各种百度谷歌无果。。。没办法,还得靠自己,这个时候最有用的就是官网文档了,于是查询了mysql官方文档中关于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 函数会使用“取最近的偶数”的规则)

通过这两条规则,我们可以看出,由于我们在使用两个字段相乘的时候,最终的结果是按照 float 类型处理的,而在计算机中 float 类型不是精确的数,因此处理结果会按照第二条来,而直接整数字段与1.005这样的小数运算的结果是因为两个参与运算的值都是精确数,因此按照第一条规则计算。从 field5 和 field6 执行 ROUND 函数的结果可以明确的看确实是转换为了最近的偶数。

总结

从这个例子中可以看到,在MySQL中使用ROUND还是要非常需要注意的,特别是当参与计算的字段中包含浮点数的时候,这个时候计算结果是不准确的。

MySQL 之 ROUND 函数四舍五入的陷阱相关推荐

  1. mysql round 四舍五入_MySQL之ROUND函数四舍五入的陷阱

    [TOC] 在MySQL中,ROUND函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本文将这一问题记录下来,以免大家跟我一样犯同样的错误. 问题描述 假 ...

  2. mysql decimal被四舍五入_MySQL之ROUND函数四舍五入的陷阱

    在MySQL中,ROUND函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并没有预期的那样,本文将这一问题记录下来,以免大家跟我一样犯同样的错误. 问题描述 假如我们有如下 ...

  3. MySQL : ROUND 函数四舍五入陷阱及解决办法

    在MySQL中, ROUND 函数用于对查询结果进行四舍五入,不过最近使用ROUND函数四舍五入时意外发现并无预期的那样,本文将这一问题记录下来,并提出解决方案. 问题描述 假如咱们有以下一个数据表 ...

  4. excel取整函数_excel舍入函数应用视频:int取整函数技巧round函数四舍五入保留指定小数位...

    excel舍入函数应用视频:int取整函数技巧视频-round函数四舍五入视频-excel保留指定小数位视频 本视频教程由部落窝教育分享.更多Excel教程请到QQ群:514869990. https ...

  5. Oracle round 函数(四舍五入)

    如何使用 Oracle Round 函数 (四舍五入) 描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果. SELECT ROUND( number, [ decimal_p ...

  6. 四舍五入函数 oracle,Oracle round函数 四舍五入

    Oracle Round 函数 (四舍五入) 描述 : 传回一个数值,该数值是按照指定的小数位元数进行四舍五入运算的结果. SELECT ROUND( number, [ decimal_places ...

  7. Math.Round函数四舍五入的问题

    今天客户跑过来跟我说,我们程序里面计算的价格不对,我检查了一下,发现价格是经过折算后的价格,结果是可能小数位较多,而单据上只能打印两位价格,所以就对价格调用Math.Round(price,2)函数进 ...

  8. round()函数,四舍五入

    print(int(1.6)) print(round(1.6) # 运行结果分别是 1 2 int()取整是忽略小数位 round()取整是按照四舍五入

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

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

最新文章

  1. [记录]mscorlib recursive resource lookup bug解决方法
  2. MySQL utf8mb4与emoji表情
  3. Spring Task配置
  4. 关于整型数据符号位扩展的问题
  5. mysql find()方法_Mysql find_in_set()函数使用方法
  6. 论文浅尝 - ACL2020 | 利用常识知识图对会话流进行显式建模
  7. ssm框架搭建+easyui增删改查实现
  8. jq判断是否为整数_jquery怎么判断是否是数字?
  9. [收藏]深入浅出的《网络socket编程指南》4
  10. 源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 2
  11. 使用java发送邮件(支持多人)
  12. win11配置mysql环境变量保姆级教程
  13. 使用java实现MD5码算法
  14. [中英字幕]吴恩达机器学习系列课程 笔记
  15. 笔记19-IO流Properties集合
  16. Siebel命令行修改LDAP
  17. python operator用法_说说 Python 中的 Operator 模块
  18. 腾讯为什么把全国最大的数据中心落户到南京?
  19. 什么是元数据(Metadata)?
  20. 乔伊·伯纳尔(Joey Bernal)的评论专栏,社交网络的三阶段路线图

热门文章

  1. Android 10 添加安装白名单和卸载黑名单
  2. 什么样的公司才需要办理ICP经营许可证?
  3. 最强蜗牛服务器维护祷告bug,最强蜗牛 这个游戏的玩家太难带了,竟然天天希望服务器有事...
  4. jQuery播放音乐
  5. python计算等额本金_等额本金-逆推 - tedzheng的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 软件分享系列之【AE 下载安装】并持续分享中...
  7. netty通讯--tcp心跳异常断开问题排查
  8. 华为网络精英挑战赛ICT部分
  9. MR案例(1)词频统计
  10. 谷歌浏览器,退出时;调用退出的方法,vue