【问题标题】:Java: questions about radians, Math.cos, Math.sin, double and longJava:关于弧度、Math.cos、Math.sin、double 和 long 的问题
【发布时间】:2011-07-09 08:18:03
【问题描述】:

我需要在我的 java 代码中实现 Harvesine 距离。

我在Javascript中找到了这个sn-p,我需要将它转换为java。

  1. 如何在 Java 中将纬度和经度转换为弧度?
  2. Math.sin 想要 Java 中的 double。我是否应该以弧度传递先前转换的值?
  3. Math.sin 和 Math.cos 返回 long。我应该声明 a as long 并将其传递给 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;

【问题讨论】:

    标签: java math


    【解决方案1】:

    首先,您应该阅读 javadoc。 sin(double) 采用 double 参数,它是文档中所述的弧度角度。您还可以在链接页面上找到 sqrt 也需要双精度。

    那么,你应该知道java可以自动进行无损转换。因此,如果一个方法需要一个 double 而你有一个 long,那将没有问题,因为 long -> double 的转换没有损失。反之为假,因此 Java 拒绝编译。

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

    【讨论】:

    • long->double 的转换可能会有损失。例如,如果 long 值是大于 2^53(或小于 -2^53)的奇数,则它不能完全表示为 double 值。不过,出于某种原因,JLS 选择忽略这些转换损失,并将这种转换视为扩大转换。 (int->float 和 long->float 也有同样的问题 - 这里的限制是 2^24。)
    • 感谢您的评论,我不知道这个。
    • Patrick 从不阅读任何文档,而是在 SO 上询问。
    【解决方案2】:
    1. 如果您有度数的价值,请执行degrees * Math.PI / 180。或者评论中coobird建议的更好的使用功能(不知道)。
    2. 是的,您可以在其中传递任何双精度值。 (就此而言,任何数字。)
    3. 不,两个函数都采用double 参数。检查the docs

    【讨论】:

    • 对于 (1),使用Math.toRadians(degrees) 会更容易阅读。
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2011-05-04
    相关资源
    最近更新 更多