2011-03-05 44 views
9

我需要在我的java代碼中實現harvesine距離。Java:有關弧度,Math.cos,Math.sin,double和long的問題

我在Javascript中找到了這個片段,我需要將它轉換爲java。

  1. 如何將經度和緯度轉換爲Java中的弧度?
  2. Math.sin需要Java中的雙精度值。我應該通過以弧度還是以前的轉換值?
  3. Math.sin和Math.cos返回很長時間。我是否應該聲明一個並將其傳遞給Math.sqrt或將其轉換爲double?

感謝

dLat = (lat2-lat1).toRad(); 
dLon = (lng2-lng1).toRad(); 
a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
    Math.sin(dLon/2) * Math.sin(dLon/2); 
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
d = R * c; 
return d; 

回答

5
  1. 如果您有度值,只是做degrees * Math.PI/180。或者在評論中更好的使用coobird建議的功能(不知道它)。
  2. 是的,你可以傳遞任何雙值。 (任何數字,就此而言)。
  3. 不,這兩個函數都取double參數。檢查the docs
+5

對於(1),使用'Math.toRadians(度)'會更容易閱讀。 – coobird 2011-03-05 09:44:02

+0

@coobird謝謝,更新。 – 2011-03-05 09:45:57

7

首先,你應該閱讀javadoc。 sin(double)在參數中採用double,該參數是文檔中所述的以弧度表示的角度。你也會在鏈接頁面上發現sqrt也需要雙倍的。

然後,您應該知道java可以自動執行非破壞性轉換。所以如果一個方法需要一個雙倍的時間,並且你有一個很長的時間,那麼這將是沒有問題的,因爲長時間的轉換沒有損失 - > double。相反是錯誤的,所以Java拒絕編譯。

對於弧度轉換,您會在Math類中找到toRadians方法。

+2

轉換可能會出現長時間錯誤 - >雙重錯誤。例如,如果long值是2^53(或低於-2^53)以上的奇數,則它不能完全表示爲double值。但由於某種原因,JLS選擇忽略這些轉換損失,並將此轉換視爲擴大轉換。 (同樣的問題int-> float和long-> float - 這裏的限制是2^24。) – 2011-03-05 11:29:16

+0

感謝您的評論,我不知道這件事。 – krtek 2011-03-05 11:30:53

+0

帕特里克從來沒有讀過任何文件的文件,而是他在這裏問這個。 – 2011-03-05 13:06:12