当前位置:Gxlcms > mysql > Mysqlfloat类型where语句判断相等问题_MySQL

Mysqlfloat类型where语句判断相等问题_MySQL

时间:2021-07-01 10:21:17 帮助过:73人阅读

bitsCN.com

今天调试程序时,发现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的专栏

bitsCN.com

人气教程排行