Distance between two coordinates : 8.35023072909283E-8 (Means 0.0000000835023072909283)
Coordinate 1 : 110.000, 89.001
Coordinate 2 : 110.000, 89.001
这里的坐标是一样的,所以我希望它会返回零距离。但是他们使用下面提到的计算公式返回到距离以下。
zero
这里的坐标是相同的,所以我希望它会返回Distance between two coordinates : 1.5033016609322658E-7 (Means 0.00000015033016609322658)
距离。但是他们使用下面提到的计算公式返回到距离以下。
Math.sqrt(Math.pow(coordinate2.getX() - coordinate1.getX(), 2) + Math.pow(coordinate2.getY() - coordinate1.getY(), 2))
用于计算我在下面的代码中使用的距离:
1.5033016609322658E-7
为什么以上公式会返回zero
距离而不是1e309
?
注意:所有坐标值都是双倍的。
答案 0 :(得分:0)
看起来你在显示它们时将坐标值四舍五入到小数点后3位。实际存储的坐标不相同,因为在您计算它们时使用的数学计算中存在一些微小的累积浮点不精确。由于你在显示时没有四舍五入,你可以看到差异。
P.S。为了整理代码,您应该将距离加速包装到Coordinate
类的方法中。 Math.hypot
也很有用:
public double distance(Coordinate c) {
return Math.hypot(x - c.x, y - c.y);
}
答案 1 :(得分:0)
我建议使用int
。例如44.001将变为44001,即代表小数,使得没有小数部分。使用您的公式计算距离并代表ans。通过乘以10的合适功率,例如10 ^ [ - 3]
这样可以避免与float
相关的错误。
请注意。如果整数表示创建非常大的no.s,请考虑使用java BigInteger
类。
答案 2 :(得分:0)
避免BigDecimal
的方法是使用整数表示。
如果您的小数数字永远不会超过第3个十进制数字,您可以通过乘以1000将坐标转换为整数表示形式。 这样,您的计算就不会失去精确度。
在返回任何值之前,您需要将其重新转换为正确的单位。
这个逻辑应该封装在你的Coordinate
类中。
答案 3 :(得分:0)
两件事: 1.如前所述,最好使用BigDecimal来计算距离。 2.计算你必须考虑的坐标之间的距离,因为它们在一个球体上,而不是在一个平面上。