2012-01-12 360 views
8

我有這樣的一個MySQL表:爲什麼這個sql查詢返回比較浮點數的任何結果?

enter image description here

idbolag_idintlatlngitudedouble

如果我使用的lngitude列,不返回任何結果:

lngitude查詢:SELECT * FROM location_forslag WHERE lngitude = 13.8461208

但是,如果我用lat列,它確實返回的結果:

lat查詢:SELECT * FROM location_forslag WHERE lat = 58.3902782

lngitude列的問題是什麼?

+0

試試'在13.8461208和13.8461209之間的哪個位置。 – Benoit 2012-01-12 17:30:57

+0

@Benoit的作品,如果我改變它爲13.8461207和13.8461208 – 2012-01-12 17:35:16

回答

9

它不是一般比較浮點數與=等於運營商是個好主意。

對於您的應用程序,你需要考慮你想要如何接近的答案是。

1度約爲112km,0.00001度約爲1.1米(在赤道)。如果兩點相差0.00000001度= 1毫米,您是否真的希望自己的申請表示「不相等」?

set @EPSLION = 0.00001 /* 1.1 metres at equator */ 

SELECT * FROM location_forslag 
WHERE `lngitude` >= 13.8461208 [email protected] 
AND `lngitude` <= 13.8461208 + @EPSILON 

這將返回lngitude在所需值的@epsilon度範圍內的點。 您應該爲您的應用選擇適合epsilon的值。

+2

使用SQL BETWEEN關鍵字在這種情況下不錯(更易讀的IMO)。 – Benoit 2012-01-12 17:37:54

+1

如何使用'lngitude' LIKE 13.8461208?這可能是一個解決方案嗎? – 2012-01-12 17:44:42

+0

@Lille_skutt:不,你必須謹慎決定你想要的準確性,並明確地進行比較。數據庫沒有任何東西可以幫助你 - 除非你安裝了一些GIS擴展。 – Ben 2012-01-12 17:57:49

4

Floating points are irritating ....

WHERE ABS(lngitude - 13.8461208) < 0.00000005 
+0

這是行不通的。所以這只是一個巧合,它與其他專欄一起工作?我可以將它存儲在更好的數據類型中嗎? – 2012-01-12 17:37:15

+0

在最近的MySQL版本中,'DECIMAL'數據類型是確切的,請參閱鏈接。 – Wrikken 2012-01-12 17:39:11

+0

數據類型沒問題,問題是「等於」的含義取決於應用程序 - 在現實世界中不存在這樣的事情。在衛星導航應用中,等於「10米以內」。對於「0.05米以內」的土地登記數據庫可能就足夠了。建一個廚房,它可能是「5毫米以內」。 – Ben 2012-01-12 17:56:20

0

將浮點數轉換爲小數點進行比較。我有同樣的問題,並像這樣解決:

SELECT 
    [dbo].[Story].[Longitude], 
    [dbo].[Story].[Latitude], 
    [dbo].[Story].[Location], 
FROM 
    [dbo].[Story], 
    [dbo].[Places] 
WHERE 
    convert(decimal, [dbo].[Story].[Latitude]) = convert(decimal, [dbo].[Places].[Latitude]) 
    and 
    convert(decimal, [dbo].[Story].[Longitude]) = convert(decimal, [dbo].[Places].[Longitude]) 
    and 
    [dbo].[Places].[Id] = @PlacesID 
    and 
    [dbo].[Story].IsDraft = 0 
ORDER BY 
    [dbo].[Story].[Time] desc 

看看WHERE clausule後面的前3行。 希望它有幫助。

相關問題