gpt4 book ai didi

sql - SQL Server 2005 中的浮点问题

转载 作者:行者123 更新时间:2023-12-04 06:48:54 25 4
gpt4 key购买 nike

下面的代码用于计算两个城市之间的英里数。在这种情况下,它是从雅茅斯,我到雅茅斯,我的距离 - 显然为零 - 这意味着雅茅斯 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 设置一些逻辑,但此示例是从嵌入在 Web 应用程序中的查询(不是我的选择)中提取的,因此我需要修复查询,即修复计算,如果可能,不使用 TSQL,并且不扭曲任何其他返回值。有任何想法吗?

最佳答案

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

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

我意识到将计算保留为浮点数可能会导致较小的舍入误差,但对于此应用程序而言,它们很小是可以接受的。感谢所有评论的人。

关于sql - SQL Server 2005 中的浮点问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3400681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com