我知道有很多像我一样的问题。我看着他们,但我似乎无法解决问题。我的数学很糟糕:s。
在c#中我使用SqlQuery来获取范围内的城市。除了一些城市外,大部分时间都可以使用。
例如,如果我向附近城市询问邮政编码为2060.我收到此错误。当我要求代码为2000的城市时,它返回2000和2060。
这是查询:
return base.Database.Database.SqlQuery<City>(
"SELECT * FROM [dbo].[City] WHERE @p0 >= (((acos(sin((@p1*pi()/180)) *
sin(([Latitude]*pi()/180))+cos((@p1*pi()/180)) * cos(([Latitude]*pi()/180)) *
cos(((@p2- [Longitude])*pi()/180))))*180/pi())*60*1.1515*1.609344)"
, radius, latitude, longitude);
有人可以解释一下这是如何改变的,这样它适用于所有“城市”以及数学中菜鸟的这个错误的原因吗?
谢谢
答案 0 :(得分:0)
问题是,当你将城市与自己进行比较时,acos()内的语句会出现舍入错误,并且语句会略微超过1,这会导致错误。
您需要以某种方式将值限制为最大值1。这是一个相当丑陋的解决方案:
return base.Database.Database.SqlQuery<City>(
"SELECT * FROM [dbo].[City] WHERE @p0 >= (((acos((select min(v) from (values (1), (sin((@p1*pi()/180)) *
sin(([Latitude]*pi()/180))+cos((@p1*pi()/180)) * cos(([Latitude]*pi()/180)) *
cos(((@p2- [Longitude])*pi()/180)))) as x(v))))*180/pi())*60*1.1515*1.609344)"
, radius, latitude, longitude);
我不确定,但它有时可能会略微小于-1,这也会出现同样的错误。然后,您必须将值限制在-1和1之间。