程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Mysql float類型where 語句判斷相等問題

Mysql float類型where 語句判斷相等問題

編輯:MySQL綜合教程

 

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved