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

时间:2020-08-06 10:07:47

标签: java math floating-point gps latitude-longitude

我正在使用this answer的实现来为我的GPS跟踪软件计算两点之间的距离。

但是,我在众多StackOverFlow上读到,使用double不好because of the inaccurate float representation of values。因此,我问:

  • 使用BigDecimal来计算距离会更准确吗?
  • 将结果从BigDecimal转换回double还会产生其他误差吗? (以存储或检索值)

2 个答案:

答案 0 :(得分:3)

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

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

要获得更准确的结果,可以使用例如Vincenty's formulae,它假定地球是一个椭球,但比大圆距更难实现。为了获得更准确的结果,您应该考虑更难的局部地形。

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

答案 1 :(得分:1)

是的,理论上在BigDecimal中进行任何计算都可以提高精度,但这非常不太可能实际上出于以下几个原因而提供帮助:

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

如果您仍然在BigDecimal中进行了计算,然后将结果转换为double,那么您肯定会失去精度,因为BigDecimal可以有效地任意精度,但是double不能。

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