您的位置:首页 > 数据库 > SQL语言 > 正文

MySQL中ROUND四舍五入函数需要注意的地方

更多 时间:2017-3-5 类别:数据库 浏览量:450

MySQL中ROUND四舍五入函数需要注意的地方

MySQL中ROUND四舍五入函数需要注意的地方

一、问题描述

1、有如下一个数据表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;
    
    			
  • 2、向这个表中插入一条数据

  •  
  • 
    INSERT INTO test (field1, field2, field3, field4, field5, field6) VALUE (100, 100, 100, 1.005, 3.5, 2.5);
    
    		
  • 3、如果执行下面这个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;
    
    		
  • 4、执行后的结果

  •  
  • 
    *************************** 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 row in set (0.00 sec)
    
    		
  • 备注:最初一直以为这样的结果肯定是都是101,因为上面这六个取值结果都是对100 * 1.005进行四舍五入,结果肯定都是101才对,而后面两个肯定是4和3才对,但是最终的结果却是与设想的大相径庭

     

    二、ROUND随机函数出现这种情况的原因

    mysql官方文档中关于ROUND函数的部分,其中包含下面两条规则

    1、对于精确的数值,ROUND函数使用四舍五入

    2、对于近似值,则依赖于底层的C函数库,在很多系统中ROUND函数会使用“取最近的偶数”的规则

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

    4、从field5和field6执行ROUND函数的结果可以明确的看确实是转换为了最近的偶数。

     

    三、MySQL中ROUND备注

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

     

    标签:MySQL
    您可能感兴趣