2011-05-26 78 views
5

這可能是一個容易的,但我無法得到答案。 我需要從表mysql浮點數據沒有選擇在哪裏條款

例如表中選擇浮點值: -

value 
10.2 
4.5 
4.6 
4.06 

我的查詢

SELECT * FROM table where value = '4.6' 

返回空結果集

我怎樣才能解決這個!

+0

[MySQL中選擇浮動]的可能重複(http://stackoverflow.com/questions/1302243/selecting-a-float-in-mysql) – Johan 2011-05-26 08:25:07

回答

15

通常,您不應該使用浮動檢查相等性(除非可能具有相同的對象)。在內部,它的表現更加精確,即使在它輸出到屏幕時它沒有顯示給你。這個基本原則適用於一般的計算。

有幾十個方案這樣做的,但這裏是一個簡單的,這應該是有意義:

SELECT * FROM table where value BETWEEN 4.599 AND 4.601 
+0

非常有用的解決方案。值-0.5和值+ 0.5之間很酷 – 2014-03-19 14:28:33

+0

任何關於精度浮點數的想法都存儲在?我正在做BETWEEN(值0.000001)和(值+ 0.000001)...是否太限制? – plong0 2015-12-31 01:54:27

+0

這個問題並不是精確的,但用數學來生成浮點數。在許多情況下,固定的epsilon(方差)很好,但是非常大(或很小)的浮點數會歪曲精度的重要性。另外,實際上微處理器之間甚至不同C編譯器之間會有差異,所以沒有真正的魔法/安全解決方案,特別是在像SQL這樣的4GL語言中。話雖如此,如果你的數字通常在相同的範圍內,你應該對上面說明的那種固定/絕對epsilon很好。 – 2016-01-06 13:39:13

4

今天,我也遇到了同樣的情況,並得到解決只是使用MySQL的格式化功能,它會返回你的WHERE子句完全匹配的結果。

SELECT * FROM yourtable WHERE FORMAT(`col`,2) = FORMAT(value,2) 

說明:

FORMAT('col name',precision of floating point number) 

希望它能幫助。

+1

這有助於在批准的答案建議時無法將列類型從float更改爲decimal。 – 2017-08-30 12:55:47

-3

你寫:

SELECT * FROM table where round(value, 1) = 4.6