本文实例讲述了MySQL中ROUND函数进行四舍五入操作陷阱。,具体如下:

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

问题描述

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

CREATE TABLE test (

id int(11) NOT NULL AUTO_INCREMENT,

field1 bigint(10) DEFAULT NULL,

field2 decimal(10,0) DEFAULT NULL,

field3 int(10) DEFAULT NULL,

field4 float(15,4) DEFAULT NULL,

field5 float(15,4) DEFAULT NULL,

field6 float(15,4) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

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

INSERT INTO test (field1, field2, field3, field4, field5, field6) VALUE (100, 100, 100, 1.005, 3.5, 2.5);

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

mysql> select * from test;

+----+--------+--------+--------+--------+--------+--------+

| id | field1 | field2 | field3 | field4 | field5 | field6 |

+----+--------+--------+--------+--------+--------+--------+

| 1 | 100 | 100 | 100 | 1.0050 | 3.5000 | 2.5000 |

+----+--------+--------+--------+--------+--------+--------+

1 rowin set (0.00 sec)

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

SELECT

round(field1 * field4),

round(field2 * field4),

round(field3 * field4),

round(field1 * 1.005),

round(field2 * 1.005),

round(field3 * 1.005),

round(field5),

round(field6)

FROM test;

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

*************************** 1. row ***************************

round(field1 * field4): 100

round(field2 * field4): 100

round(field3 * field4): 100

round(field1 * 1.005): 101

round(field2 * 1.005): 101

round(field3 * 1.005): 101

round(field5): 4

round(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函数库,在很多系统中

mysql round不四舍五入_MySQL中ROUND函数进行四舍五入操作陷阱分析相关推荐

  1. mysql通过集合查询_MySQL使用集合函数进行查询操作实例详解

    本文实例讲述了MySQL使用集合函数进行查询操作.分享给大家供大家参考,具体如下: COUNT函数 SELECT COUNT(*) AS cust_num from customers; SELECT ...

  2. mysql sleep详解_MySQL中sleep函数的特殊现象示例详解

    前言 MySQL中的系统函数sleep,实际应用的场景不多,一般用来做实验测试,昨天在测试的时候,意外发现sleep函数的一个特殊现象.如果在查询语句中使用sleep函数,那么休眠的时间跟返回的记录有 ...

  3. mysql extract什么意思_mysql中json_extract函数的使用?作用是什么?

    http://www.cnblogs.com/chuanzhang053/p/9139624.html 需求描述: 今天看mysql中的json数据类型,涉及到一些使用,使用到了函数json_extr ...

  4. mysql min怎么用_MySQL中MIN()函数的使用教程

    MySQL的MIN函数是用来找出一个记录集最小值的记录. 要了解MIN函数考虑的EMPLOYEE_TBL表具有以下记录: mysql> SELECT * FROM employee_tbl; + ...

  5. mysql 字符串出现问题_MYSQL 中字符串函数 归纳总结

    计算字符串长度 mysql> select length("你好"); +----------------+ | length("你好") | +---- ...

  6. java小数点后两位 四舍五入_Java中double函数,四舍五入并保留小数点后两位的4种方法,BMI案例...

    今天写了一个小程序,Java 语言的测试BMI[谁不知道"BMI"的自行百度不解释],涉及到了四舍五入并保留小数点后两位,就总结了一下.先给大家看看程序 就是说给大家提供4种方法来 ...

  7. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  8. 在MySQL的InnoDB存储引擎中count(*)函数的优化

    转载自  在MySQL的InnoDB存储引擎中count(*)函数的优化 写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读 ...

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

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

最新文章

  1. mysql 使用位运算
  2. zabbix3 通过snmpv3监控linux主机
  3. 信息安全系统设计基础第一周学习总结
  4. LeetCode第一刷--leetcode提交格式介绍与273. Integer to English Words
  5. php离开界面监听,js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)...
  6. 将SimCLR应用于NLP预训练模型,提升句子语义表征效果
  7. java中的%%%_JSP页面中%!%与%%与%=%
  8. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?...
  9. 创建consumer服务
  10. oracle语句借书,Oracle SQL题目及其解答(借书卡、图书、借书记录)
  11. window. onload=function(){} 与 $(function(){}) 的区别
  12. 还不懂!软件测试(功能、接口、性能、自动化)详解
  13. 【Elasticsearch】Limit of total fields [1000] in index [xxxxxx_index] has been exceeded
  14. 凸优化第九章无约束优化 9.1 无约束优化问题
  15. 利用Samba搭建Backup Server配置文件
  16. 调通sina33下的AP6212A0(WIFI+BT)V1.2
  17. linux 向日葵教程,远程控制工具——Centos7上向日葵安装使用(转)
  18. nuxt.js项目打包上传服务器pm2启动各种问题
  19. 引用 USB启动盘,将DOS工具集成到WinPE的grub - Windows
  20. python股票回测源码_股票量化交易回测框架pyalgotrade源码阅读(一)

热门文章

  1. mysql漏洞补丁升级_mysql 5.7 高危漏洞及升级修复步骤
  2. 穆利堂[推荐] WxPM信息化整体解决方案-河南郑州房地产工程项目管理系统软件 穆穆-movno1
  3. Apereo CAS 4.1 反序列化命令执行漏洞复现
  4. 学之思考试系统功能开发文档
  5. 计算机鼠标一直转圈圈 打不开文件,win7系统打开文件夹时鼠标右键一直转圈怎么办?通过bat文件来解决...
  6. 计算机公共基础知识(N-S图,DFD图,PAD图,程序流程图,E-R图)
  7. 在TriCore架构芯片上移植 RT-Thread
  8. 视频教程-jQuery交互式前端开发(第一季):初体验/选择器/事件绑定-jQuery
  9. 实战PyQt5: 143-QChart图表之堆积柱状图
  10. 硕士毕业论文写不出来导致严重焦虑,怎么办?