2014-06-18 29 views
0

我知道有很多像我的問的問題。我看着他們,但我似乎無法解決問題。我在數學上只是不好:s。檢查經度和緯度時發生無效的浮點操作

在c#中我使用SqlQuery來獲取範圍內的城市。除了一些城市,大部分時間都適用。

例如,如果我用城市郵政編碼2060詢問城市的附近城市,我得到這個錯誤。當我問它的城市代碼2000,它返回2000年和2060

  • 2060:緯度 = 51.2293515000 = 4.4279883000
  • 2000:緯度 = 51.2198771000 = 4.4011356000

這是查詢:

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); 

有人可以解釋如何改變它,所以它適用於所有的「城市」,以及如果這個數學noob的錯誤的原因呢?

謝謝

+0

請格式化代碼。 –

+0

Sry,試圖添加段落,但它只是顯示了p標籤。 –

回答

0

的問題是,裏面ACOS的聲明()somtimes得到一個舍入誤差,當你比較城市本身,而變成聲明略微超過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之間。

+0

謝謝。因此,如果問題發生在與自身比較時,是不是可以添加WHERE longitude!= param1 AND latitude!= param2,然後是acos函數? –

+0

當然,那麼你會從結果中排除城市本身。如果你想包含它們,你可以使用「WHERE(longitude = param1 AND latitude = param2)或(acos stuff here)」,那麼acos的東西不應該運行(我認爲) – jokedst