Java中的Haversine公式产生不正确的结果

She*_*har -1 java math gps formula haversine

我正在尝试使用Haversine formula 维基百科给出的这个实现进行试验,但这个公式没有给出预期的结果。

public class Haversine {
    public static final double R = 6372.8; // In kilometers
    public static double haversine(double lat1, double lon1, double lat2, double lon2) {
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);
        lat1 = Math.toRadians(lat1);
        lat2 = Math.toRadians(lat2);

        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
        double c = 2 * Math.asin(Math.sqrt(a));
        return R * c;
    }
    public static void main(String[] args) {
        System.out.println(haversine(36.12, -86.67, 33.94, -118.40));
    }
}
Run Code Online (Sandbox Code Playgroud)
Input GPS latitude format  : ddmm.mmmm
Input GPS longitude format : dddmm.mmmm
Run Code Online (Sandbox Code Playgroud)

以上经纬度格式在需求文档中指定。

示例输入坐标如下:

lat1 = 3359.64868, lon1 = 8356.178
lat2 = 3359.649,   lon2 = 8356.178
Run Code Online (Sandbox Code Playgroud)

在将这些值传递给Haversine 方法之前,我将这些值转换为度数格式。如果不需要此步骤,请纠正我。

我使用下面的公式从度分钟格式转换为十进制格式:

Decimal Degree = degree + (minute / 60)
Run Code Online (Sandbox Code Playgroud)

于是新坐标变成

lat1 = 33 + (59.64868 / 60) = 33.994144666666664
lon1 = 83 + (56.178 / 60) = 83.9363

lat2 = 33 + (59.649 / 60) = 33.99415
lon2 = 83 + (56.178 / 60) = 83.9363
Run Code Online (Sandbox Code Playgroud)

调用 hasrsine 方法变得像

haversine(33.994144666666664, 83.9363, 33.99415, 83.9363)
Run Code Online (Sandbox Code Playgroud)

这是返回值 5.932071604620887E-4

为了验证这些值,我向本网站(33.994144666666664, 83.9363, 33.99415, 83.9363)上的转换器提供了相同的输入,但它给出的结果为km。0.001

我试图提供输入值而不转换为十进制度数,但随后两种方法的输出也不匹配。

谁能告诉我我在这里做错了什么?

Ste*_*ett 5

5.932071604620887E-4您得到的结果是 的表示5.932071604620887 * 10^(-4),即5.932071604620887 / 10000 = 0.0005932071604620887

如果网站返回0.001,我的建议是他们只四舍五入到小数点后第 3 位。因此,您的计算是正确的。