今天调试程序时,发现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 // 1乘以10的负5次幂,0.000001
用绝对值函数的方法来判断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进行.