MySQL数据库浮点数精度误差的解决方法(建议尽量使用定点数)

    今天在工作中发现MySQL数据库的一个数据表中有一个叫做fund1的字段, 在Navicat中看到有一条记录fund1的值为0.04,我在PHP程序中使用where查询fund1等于0.04的时候根本没有结果,用Navicat的筛选查询也没有出现任何结果。
    于是我想起了之前见到很多浮点数例如0.04存放在数据库中的时候,实际上的值是0.03989balabala这样的一大串随机数,只是设置了这个字段的长度和精确到小数点后几位之后就通过四舍五入显示为0.04,实际上这个值不等于0.04。用PHP查询得到的数据也是诸如0.03989balabala这样的一大串随机数,所以之前我都是用PHP的round()函数来四舍五入,虽然可以解决问题,但是像查询fund1=0.04这样的条件就没办法使用数据库直接实现,而是要通过程序来处理结果。
    后来,我把数据库中fund1字段的类型改成了定点数(decimal),长度和精确到小数点后几位都不变,这样之后就能够准确实现查询了。我在网上还找到了几条建议:
    在今后关于浮点数和定点数的应用中,大家要记住以下几点:
    1、浮点数存在误差问题;
    2、对货币等对精度敏感的数据,应该用定点数表示或存储;
    3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
    4、要注意浮点数中一些特殊值的处理。

C语言格式化输出的对照

printf(“<格式化字符串>”, <参量表>);

 

%d 十进制有符号整数 (记忆法:decimal)

%u 十进制无符号整数

%f 浮点数 (记忆法:float)

%s 字符串

%c 单个字符

%p 指针的值

%e 指数形式的浮点数

%x, %X 无符号以十六进制表示的整数

%0 无符号以八进制表示的整数

%g 自动选择合适的表示法

Tonitech版权所有 | 转载请注明出处: http://www.tonitech.com/?p=41