• 售前

  • 售后

热门帖子
入门百科

MySQL中ROUND函数进行四舍五入操作陷阱分析

[复制链接]
leefengme 显示全部楼层 发表于 2021-10-26 13:08:58 |阅读模式 打印 上一主题 下一主题
本文实例报告了MySQL中ROUND函数举行四舍五入操作陷阱。分享给各人供各人参考,详细如下:
在MySQL中,
  1. ROUND
复制代码
函数用于对查询效果举行四舍五入,不过最近利用
  1. ROUND
复制代码
函数四舍五入时意外发现并没有预期的那样,本文将这一题目记载下来,以免各人跟我一样犯同样的错误。
题目形貌

如果我们有如下一个数据表 test ,建表语句如下
  1. CREATE TABLE test (
  2. id int(11) NOT NULL AUTO_INCREMENT,
  3. field1 bigint(10) DEFAULT NULL,
  4. field2 decimal(10,0) DEFAULT NULL,
  5. field3 int(10) DEFAULT NULL,
  6. field4 float(15,4) DEFAULT NULL,
  7. field5 float(15,4) DEFAULT NULL,
  8. field6 float(15,4) DEFAULT NULL,
  9. PRIMARY KEY (id)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码
我们创建了一个名为 test 的表,出了 id 字段之外还包罗了多个字段,拥有这差异的数据类型。我们向这个表中插入一条数据
  1. INSERT INTO test (field1, field2, field3, field4, field5, field6) VALUE (100, 100, 100, 1.005, 3.5, 2.5);
复制代码
插入之后表中的数据是如许的
  1. mysql> select * from test;
  2. +----+--------+--------+--------+--------+--------+--------+
  3. | id | field1 | field2 | field3 | field4 | field5 | field6 |
  4. +----+--------+--------+--------+--------+--------+--------+
  5. | 1 |  100 |  100 |  100 | 1.0050 | 3.5000 | 2.5000 |
  6. +----+--------+--------+--------+--------+--------+--------+
  7. 1 rowin set (0.00 sec)
复制代码
如果现在我们执行下面这个SQL,你觉得效果会是什么样的呢?
  1. SELECT
  2. round(field1 * field4),
  3. round(field2 * field4),
  4. round(field3 * field4),
  5. round(field1 * 1.005),
  6. round(field2 * 1.005),
  7. round(field3 * 1.005),
  8. round(field5),
  9. round(field6)
  10. FROM test;
复制代码
最初不绝以为如许的效果肯定是都是 101 ,由于上面这六个取值效果都是对 100 * 1.005 举行四舍五入,效果肯定都是 101 才对,而背面两个肯定是 4 和 3 才对,但是终极的效果却是与假想的大相径庭
  1. *************************** 1. row ***************************
  2. round(field1 * field4): 100
  3. round(field2 * field4): 100
  4. round(field3 * field4): 100
  5. round(field1 * 1.005): 101
  6. round(field2 * 1.005): 101
  7. round(field3 * 1.005): 101
  8.     round(field5): 4
  9.     round(field6): 2
  10. 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函数库,在许多系统中
    1. ROUND
    复制代码
    函数会利用“取最近的偶数”的规则)
通过这两条规则,我们可以看出,由于我们在利用两个字段相乘的时间,终极的效果是按照 float 类型处置惩罚的,而在计算机中 float 类型不是准确的数,因此处置惩罚效果会按照第二条来,而直接整数字段与1.005如许的小数运算的效果是由于两个到场运算的值都是准确数,因此按照第一条规则计算。从 field5 和 field6 执行
  1. ROUND
复制代码
函数的效果可以明白的看确实是转换为了最近的偶数。
总结

从这个例子中可以看到,在MySQL中利用
  1. ROUND
复制代码
还是要非常需要注意的,特殊是当到场计算的字段中包罗浮点数的时间,这个时间计算效果是禁绝确的。
更多关于MySQL相关内容感爱好的读者可查看本站专题:《MySQL查询本领大全》、《MySQL事务操作本领汇总》、《MySQL存储过程本领大全》、《MySQL数据库锁相关本领汇总》及《MySQL常用函数大汇总》
希望本文所述对各人MySQL数据库计有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作