2025-05-23

 

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *