Mysql float类型where 语句判断相等问题
2014-06-09 15:01
351 查看
今天调试程序时,发现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进行.
http://blog.csdn.net/ykm0722/article/details/7003754
后来问了耿博,给了一种方法,感觉挺好用的,如下
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进行.
http://blog.csdn.net/ykm0722/article/details/7003754
相关文章推荐
- Mysql float类型where 语句判断相等问题
- Mysql float类型where 语句判断相等问题
- Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题
- Struts2 用 s:if test 判断String类型的对象属性值和单字符是否相等的问题
- 如何判断int、double、float类型数据为0或判断一个未知数据类型的为0或相等
- 判断两个float类型数据是否相等
- MySQL中float类型字段的显示问题
- MySql 字段类型为float时,SUM汇总时出现一堆小数的问题
- Java中判断两个float类型数据是否相等
- 深入理解C++浮点数(float、double)类型数据比较、相等判断
- mybatis 拼接语句时,Boolean 类型判断为false的时候不生效问题
- 深入理解C++浮点数(float、double)类型数据比较、相等判断
- 深入理解C++浮点数(float、double)类型数据比较、相等判断
- Mysql - WHERE语句中使用AND,OR操作符的次序问题
- 【C++菜鸟问题】C++浮点数(float、double)比较、相等判断
- 获取MYSQL 的binlog文件类型问题,判断并转换
- 深入理解C++浮点数(float、double)类型数据比较、相等判断
- MySQL登陆方式、数据类型、数据引擎及SQL查询语句,注意的问题.
- 深入理解C++浮点数(float、double)类型数据比较、相等判断
- 深入理解C++浮点数(float、double)类型数据比较、相等判断