代码之家  ›  专栏  ›  技术社区  ›  gfrizzle

sqlserver2005中的浮点问题

  •  2
  • gfrizzle  · 技术社区  · 16 年前

    下面的代码用于计算两个城市之间的英里数。在这种情况下,是从雅茅斯到雅茅斯的距离,很明显是零,这意味着在雅茅斯X英里范围内的城市的结果应该包括雅茅斯本身。

    问题是雅茅斯的经纬度似乎引起了某种浮点问题(我在其他城市没有看到这种情况):

    DECLARE @fromlong FLOAT, @fromlat FLOAT, @tolong FLOAT, @tolat FLOAT, @test FLOAT
    
    SET @fromlong = 43.8219
    SET @fromlat = -70.1758
    SET @tolong = 43.8219
    SET @tolat = -70.1758
    SET @test = SIN(@fromlong / ( 180 / PI() )) * SIN(@tolong / ( 180 / PI() )) + COS(@fromlong / ( 180 / PI() )) * COS(@tolong / ( 180 / PI() )) * COS(@fromlat / ( 180 / PI() ) - @tolat / ( 180 / PI() ))
    
    PRINT @test /*** Displays "1" ***/
    
    SELECT 3963.0 * ACOS(@test) /*** Displays "a domain error has occurred" ***/
    

    首先,这是一个SQL Server错误吗?

    第二,我能做些什么来绕过它?我知道在上面的例子中,我可以有一些逻辑 IF @test > 1

    1 回复  |  直到 16 年前
        1
  •  3
  •   gfrizzle    16 年前

    评论中的共识似乎是使用FLOAT。我在示例中只使用了FLOAT,因为这是从中读取纬度/经度的列的数据类型,但这似乎是问题的核心。因为我无法更改列本身的数据类型,所以最简单的解决方案是更改结果计算的数据类型,这似乎在所有情况下都可以正常工作:

    SELECT 3963.0 * ACOS(CONVERT(DECIMAL(10, 6), @test))
    

    推荐文章