繁体   English   中英

如何精确计算 Java 中的距离?

[英]How to precisely calculate distances in Java?

我正在使用这个答案的实现来计算我的 GPS 跟踪软件的两点之间的距离。

但是,我在许多 StackOverFlow 上读到,使用double是不好的,因为值的浮点表示不准确 因此,我要问:

  • 使用BigDecimal计算距离会更准确吗?
  • 将结果从 BigDecimal 转换回double会产生额外的不准确性吗? (存储或检索值)

不,使用BigDecimal代替double不会显着提高该算法的准确性。

错误的主要来源是建模错误:您使用的公式假设地球是一个完美的球体。 这意味着结果可能有多达 0.5% 的错误。 使用 double 得到的舍入误差约为 0.000000000001%。

为了获得更准确的结果,您可以使用例如Vincenty 的公式,它假设地球是一个椭球体,但它比大圆距离更难实现。 要获得更准确的结果,您应该考虑当地的地形,这更加困难。

进一步阅读: https://en.m.wikipedia.org/wiki/Geographical_distance

是的,理论上在BigDecimal中进行任何计算都可以提高精度,但这实际上不太可能有帮助,原因如下:

  • 正如您发现的那样,有一些非天真的算法可以仅使用double来计算距离,而不会产生过多的数值误差。
  • 此用例的double精度值的精度比您可能开始使用的任何位置信息的精度和准确度高出许多数量级。 这意味着测量误差肯定会大于使用double引起的数值误差。

而且,如果您无论如何都在BigDecimal中进行了计算,然后将结果转换为double ,那么您当然会失去精度,因为BigDecimal可以有效地任意精确,但double不能。

但同样:精度损失与您描述的用例无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM