今天調試程序時,發現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的專欄