浮点sql server转换问题

时间:2013-07-03 08:03:19

标签: sql-server

我有这样的声明:

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

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

4 个答案:

答案 0 :(得分: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纳米,或者是一个复杂碳水化合物分子的大小或者某种类似的东西。这对于分子生物学来说很酷,但对于商店发现者来说显然有点过分了。

答案 1 :(得分:0)

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

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

您可以在此处找到有关空间数据类型的更多信息http://msdn.microsoft.com/en-us/library/bb933790.aspx

答案 2 :(得分:0)

尝试使用 cast() or 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

答案 3 :(得分:0)

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