欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

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

程序员文章站 2022-05-15 17:50:54
...
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)

用绝对值函数的方法来判断float 类型值的相等问题,精度也很高,还很方便,佩服耿博啊!

网上还有几种方法处理这种问题,感觉不是特别好!像什么大于一个值,然后小于另一个值 这是一种方法,还有的是靠增加字段,这些方法感觉都不太好!

网上查到的解决方法:

解决方法:

第一个是用区间:

select * from olympic_result where result>10.27 and result

第二个就是在设计根本不设计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