2011-03-05 51 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