必须将地理坐标从角度转为弧度,因为java三角函数默认接收弧度;纬度经度需分别用math.toradians()转换,再计算差值并代入haversine公式。

地理坐标(如纬度、经度)通常以角度为单位,而球面距离计算(比如 Haversine 公式或大圆距离)必须使用弧度。Java 中 Math.toRadians(double degrees) 就是专为这种转换设计的工具——它把角度值乘以 π/180,得到等效弧度值。
为什么必须转成弧度?
三角函数(Math.sin、Math.cos、Math.atan2 等)在 Java 中默认接收弧度。若直接传入角度(例如 45),结果会严重错误——Math.sin(45) 算的是 45 弧度(≈2578°)的正弦,而非 45°。地理计算依赖精确的三角关系,因此角度坐标必须先调用 Math.toRadians()。
如何对经纬度变量正确转换?
纬度(latitude)和经度(longitude)都是角度值,需分别转弧度:
- 纬度范围是 −90° 到 +90°,经度是 −180° 到 +180°,都可直接传入
Math.toRadians() - 转换后变量名建议体现单位,例如
latRad、lonRad,避免后续误用角度值 - 不要对差值“再转一次”:比如
Math.toRadians(lon2 - lon1)是错的;应先算差(角度差),再转弧度:Math.toRadians(lon2) - Math.toRadians(lon1)
实际计算中的典型用法(Haversine 示例)
以下代码片段展示关键转换步骤:
double lat1 = 39.9042; // 北京纬度(角度) double lon1 = 116.4074; // 北京经度(角度) double lat2 = 31.2304; // 上海纬度(角度) double lon2 = 121.4737; // 上海经度(角度) <p>// ✅ 正确:各自转弧度 double lat1Rad = Math.toRadians(lat1); double lon1Rad = Math.toRadians(lon1); double lat2Rad = Math.toRadians(lat2); double lon2Rad = Math.toRadians(lon2);</p><p>// ✅ 正确:弧度相减(不是角度相减后再转) double dLat = lat2Rad - lat1Rad; double dLon = lon2Rad - lon1Rad;</p><p>// 后续代入 Haversine 公式(sin、cos 等均作用于弧度) double a = Math.sin(dLat/2) <em> Math.sin(dLat/2) + Math.cos(lat1Rad) </em> Math.cos(lat2Rad) <em> Math.sin(dLon/2) </em> Math.sin(dLon/2); double c = 2 <em> Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); double distance = 6371 </em> c; // 单位:公里(地球平均半径) </p>
常见误区提醒
-
别混用单位:确保所有三角函数输入全是弧度,输出(如
Math.atan2结果)也是弧度,无需再转 -
别忽略符号:负纬度(南纬)和负经度(西经)直接传入
Math.toRadians()即可,它支持负数 -
别用错常量:π 相关计算请用
Math.PI,不要手写 3.14159 或自定义 π/180 系数——Math.toRadians()内部已优化且精度更高










