zoukankan      html  css  js  c++  java
  • 转:Mysql float类型where 语句判断相等问题

    原文地址:https://www.2cto.com/database/201111/111983.html

    原文内容如下:

    Mysql where 语句中有float 类型数据判断相等时,检索不出记录。

    mysql 对像这种  SELECT RecordTime FROM test WHERE ziduan=98.1 是检索不到记录的,百度了下,查到原因是浮点值在电脑存放为10.27999973297119140625 这种形式.听高手讲是:因为10进制和2进制之间的误差.看样子误差也在第七位出现了.所以小数据保留七位或是八位是有依据的.在大多数计算机语言中,该问题很常见,这是因为,并非所有的浮点值均能以准确的精度保存。
    后来问了耿博,给了一种方法,感觉挺好用的,如下
     SELECT RecordTime FROM test WHERE ABS(ziduan- 98.1) < 1e-5
    用绝对值函数的方法来判断float 类型值的相等问题,精度也很高,还很方便,佩服耿博啊!

    网上还有几种方法处理这种问题,感觉不是特别好!像什么大于一个值,然后小于另一个值 这是一种方法,还有的是靠增加字段,这些方法感觉都不太好!
    网上查到的解决方法:
    解决方法:
    第一个是用区间:
    select * from olympic_result where result>10.27 and result<10.29;
    第二个就是在设计根本不设计float型的字段,而是用一个int型+标识这个int型的小数位来代替float型,也就是result=10.28在数据库中存的是result=10.28,precision=2
    缺点:但这种方法,排序时,不好解决.
    第三个方法:设计时多做一个字符字段:
    如:alter table olympic_result add cresutl varchar(32);
    插入更新时,加上引号.
    >update olympic_result set cresult='10.28' where id=1;
    这样去处理.
    查询:
    mysql> select * from olympic_result where cresult='10.28';
    +----+---------+-------+--------+-----------+---------+
    | id | user_id | types | result | times | cresult |
    +----+---------+-------+--------+-----------+---------+
    | 1 | 243 | 1 | 10.28 | 143243242 | 10.28 |
    +----+---------+-------+--------+-----------+---------+

    排序时可以按result进行.

    每天都在进步,和同事还有很大差距啊,加油!未来一定会好的!

    摘自ykm0722的专栏

  • 相关阅读:
    Python float() 函数
    Python bytearray() 函数
    scanner.nextInt()与scanner.nextDouble
    Scanner对象next与nextLine
    JavaDoc
    包机制
    运算符要点
    变量与常量
    test
    类型转换
  • 原文地址:https://www.cnblogs.com/mumu122GIS/p/9770541.html
Copyright © 2011-2022 走看看