Java:关于弧度,Math.cos,Math.sin,double和long的问题

ane*_*yzm 10 java math

我需要在我的java代码中实现harvesine距离.

我在Javascript中找到了这个片段,我需要将其转换为java.

  1. 如何在Java中将纬度和经度转换为弧度?
  2. Math.sin想在Java中使用double.我应该以弧度为单位传递先前转换的值吗?
  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;
Run Code Online (Sandbox Code Playgroud)

krt*_*tek 7

首先,你应该阅读javadoc.sin(double)采用doublein参数,这是弧度中的角度,如文档中所述.您还可以在链接页面上找到sqrt也需要双倍的内容.

然后,您应该知道java可以自动执行非破坏性转换.因此,如果一个方法需要一个双倍而且你有一个很长的时间,那就不会有问题,因为转换long-> double没有损失.反之亦然,因此Java拒绝编译.

对于弧度转换,您将在Math类中找到toRadians方法.

  • 转换long-> double可能会有损失.例如,如果long值是高于2 ^ 53(或低于-2 ^ 53)的奇数,则它不能完全表示为double值.出于某种原因,JLS选择忽略这些转换损失,并将此转换视为扩展转换.(对于int-> float和long-> float也有同样的问题 - 这里的限制是2 ^ 24.) (2认同)

Nik*_*bak 5

  1. 如果你有度数的价值,那就做degrees * Math.PI / 180.或者更好地使用coobird在评论中提出的功能(不知道它).
  2. 是的,您可以传递任何双重值.(就此而言,任何数字.)
  3. 不,两个函数都带double参数.检查文档.

  • 对于(1),使用`Math.toRadians(degrees)`将更容易阅读. (5认同)