2010-02-02 80 views
12

我有一個Joomla系統,我試圖改變搜索,以便它正確地找到數據庫中的浮點值。檢查MySQL Float字段上的相等性

所以,我在運行時建立一個查詢,看起來像這樣:

select 'column1' 
from 'some_table' 
where 'some_float_field' <=> '2.18' 

這是不行的,它永遠不會匹配任何東西,即使我看到的記錄在數據庫中該值那裏。

於是,我就只是這樣做,而不是:

select 'column1' 
from 'some_table' 
where 'some_float_field' <=> 2.18 

沒有運氣,所以後來我試圖強制轉換爲十進制(浮動不會出於某種原因),所以我想這:

select 'column1' 
from 'some_table' 
where 'some_float_field' <=> CAST('2.18' AS DECIMAL(20, 2)) 

沒有骰子...

請記住,> =或< =返回正確的結果,只是< =>給我的問題。

我該如何在這裏工作?

回答

12

這是很好的提供了一個小例子來複制你的結果。

通常測試精確的浮點值是一個壞主意,因爲浮點精度不是一門精確的科學。使用一些容差要好得多。

create table foo1 (col1 float); 

insert into foo1 values (2.18); 
select * from foo1 where abs(col1-2.18) <= 1e-6 
+0

是的,在這種情況下,我實際上是在試圖找到用戶所投入東西的「重量」,但他們想要匹配確切的數字,所以我必須滿足要求。 – Joseph 2010-02-02 22:28:24

+2

用戶需要在表中使用浮點數據類型嗎?通常,當用戶想要精確的分數(例如貨幣)時,十進制數據類型是更好的選擇。未來幾年你會遇到四捨五入的問題。想想看。如果它真的是金錢,無論如何,不​​要浪費時間,重新設計現在的小數點。相信我,我從這裏講述經驗。 – 2010-02-03 02:05:59

+0

我同意塞瓦。在開始處理新數據庫之前,我要做的第一件事是運行以下查詢並查找使用了多少浮點數列。 SELECT DATA_TYPE,COUNT(*)AS mycount FROM information_schema.COLUMNS WHERE TABLE_SCHEMA NOT IN('information_schema','mysql')GROUP BY DATA_TYPE ORDER BY mycount DESC 如果我發現double,float,bigint和blob的數目是太高,我認爲會有很多問題。 如果十進制數,日期,日期時間,tinyint太小(或不足),那麼再次出現問題:) – shantanuo 2010-02-03 06:42:44

1

考慮一下:通常與這些類型的問題

where abs(some_float_field) - 2.18 < 0.001 
+0

我理解精度問題。在我的情況下,我不關心精度超過小數點後第二位。我只是想找到任何匹配的東西,我不想做任何算術。 – Joseph 2010-02-02 22:24:35

4

我找到了一種方法來檢查我的用戶視爲平等。

我只好到外地轉換爲字符串並測試字符集,所以此工程罰款對他們來說:

select 'column1' 
from 'some_table' 
where CAST('some_float_field' AS CHAR) <=> '2.18' 
0

我知道這是一個老的文章,但如果你不想精確對比只是使用LIKE或不喜歡:

select 'column1' 
from 'some_table' 
where 'some_float_field' NOT LIKE '2.18' 
+0

這是一個字符串比較!它還返回像'12.18'等行。 – xmedeko 2017-10-12 06:34:54

+0

@xmedeko作者要求找到一種方法來獲取所有值不等於2.18。即使它是一個字符串比較12.18不等於2.18,所以返回12.18沒有問題。另外,如果您仔細查看我的查詢,您會注意到我沒有使用百分號,因此12.18是一個正確的返回值。 – Shaolin 2017-10-13 07:41:26

+0

@xmedeko沒有什麼可編輯的。如果你只想要浮點數等於2.18,那麼就使用不帶%符號的LIKE,它將只檢索2.18。 (2.18),(12.18),(32.18); SELECT * FROM test where price LIKE'2.18';' – Shaolin 2017-10-16 08:50:32