3

我有这个声明:

Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
 from stores 
  where STORE_LATITUDE=24.6669863852163
         and STORE_LONGTITUDE=46.69189453125

这个语句应该返回一行,我很确定我把正确的纬度和经度放在数据库表中,但它返回空值而不是我正在寻找的商店,但我找不到我的错误 STORE_LATITUDE, STORE_LONGITUDE 被声明为浮点数

4

4 回答 4

1

浮点值本质上是近似值。很难让他们比较平等;关于“手榴弹和马蹄铁的密切计数”的古老格言也适用于浮点计算。

我想说的是,您永远无法可靠地测试浮点数之间的相等性。

您需要这样的查询:

 Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
   from stores 
  where STORE_LATITUDE BETWEEN 24.6669863852163 - 0.0001
                           AND 24.6669863852163 + 0.0001
    AND STORE_LONGTITUDE BETWEEN 46.69189453125 - 0.0001
                             AND 46.69189453125 + 0.0001

顺便说一句,纬度0.0001度相当于地面约11米。您的商店位置不太可能接近那么准确,因为这就是地球形状的球形假设开始分崩离析的地方。

像 24.6669863852163 这样的纬度数据的精度大约是 11 纳米,或者是复杂碳水化合物分子的大小或类似的东西。这对于分子生物学来说很酷,但对于寻找商店的人来说显然是过分的。

于 2013-08-07T20:10:13.210 回答
0

您的代码在 Sql Server 2008 中运行良好:sqlfiddle

于 2013-07-03T08:33:28.700 回答
0

浮点数不能正确保持精度,如果您需要精确的精度,那么您必须使用十进制数据 Type 。在上述情况下,您可以将值重新定义为 Decimal(38,20) 以存储经度和纬度值。

如果您使用的是 SQL Server 2008 或更高版本,则 SQL Server 支持 SPATIAL 数据类型,它具有保存经度和纬度的功能,并且还可以在它们之上进行大量计算。

您可以从这里找到更多关于空间数据类型的信息http://msdn.microsoft.com/en-us/library/bb933790.aspx

于 2013-07-03T08:23:37.820 回答
0

尝试使用cast() 或 convert()

Select STORE_NAME,STORE_LATITUDE,STORE_LONGTITUDE
from stores 
where Convert(decimal(9,2),STORE_LATITUDE)=24.66
and Convert(decimal(9,2),STORE_LONGTITUDE)=46.69
于 2013-07-03T08:29:33.250 回答