2012-01-12 103 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行。 希望它有帮助。

相关问题