如何精确计算Java的距离?
How to precisely calculate distances in Java?
我正在使用 this answer 的实现来为我的 GPS 跟踪软件计算两点之间的距离。
但是我在许多 Whosebug 上读到使用 double
是不好的 because of the inaccurate float representation of values。因此,我要问:
- 使用
BigDecimal
计算距离会更准确吗?
- 将 BigDecimal 的结果转换回
double
会产生额外的错误吗? (存储或检索值)
是的,理论上在 BigDecimal
中进行任何计算都可以提高精度,但由于以下几个原因,非常 不太可能实际提供帮助:
- 如您所见,有 non-naive 算法可以仅使用
double
计算距离,而不会出现过多的数值错误。
- 此用例的
double
值的精度比您可能开始使用的任何位置信息的精度和准确度高许多数量级。这意味着测量误差肯定会大于使用double
. 引起的数值误差
而且,如果您无论如何都在 BigDecimal
中进行计算,然后将结果转换为 double
,那么您当然会失去精度,因为 BigDecimal
可以有效地任意计算准确,但 double
不能。
但同样:精度损失与您描述的用例无关。
不,使用 BigDecimal
而不是 double
不会显着提高该算法的准确性。
错误的主要来源是建模错误:您使用的公式假设地球是一个完美的球体。这意味着结果可能有 0.5% 的误差。使用 double 得到的舍入误差约为 0.000000000001%。
为了得到更准确的结果,您可以使用例如Vincenty's formulae,它假设地球是一个椭球体,但它比大圆距离更难实现。要获得更准确的结果,您应该考虑当地的地形,这更难。
我正在使用 this answer 的实现来为我的 GPS 跟踪软件计算两点之间的距离。
但是我在许多 Whosebug 上读到使用 double
是不好的 because of the inaccurate float representation of values。因此,我要问:
- 使用
BigDecimal
计算距离会更准确吗? - 将 BigDecimal 的结果转换回
double
会产生额外的错误吗? (存储或检索值)
是的,理论上在 BigDecimal
中进行任何计算都可以提高精度,但由于以下几个原因,非常 不太可能实际提供帮助:
- 如您所见,有 non-naive 算法可以仅使用
double
计算距离,而不会出现过多的数值错误。 - 此用例的
double
值的精度比您可能开始使用的任何位置信息的精度和准确度高许多数量级。这意味着测量误差肯定会大于使用double
. 引起的数值误差
而且,如果您无论如何都在 BigDecimal
中进行计算,然后将结果转换为 double
,那么您当然会失去精度,因为 BigDecimal
可以有效地任意计算准确,但 double
不能。
但同样:精度损失与您描述的用例无关。
不,使用 BigDecimal
而不是 double
不会显着提高该算法的准确性。
错误的主要来源是建模错误:您使用的公式假设地球是一个完美的球体。这意味着结果可能有 0.5% 的误差。使用 double 得到的舍入误差约为 0.000000000001%。
为了得到更准确的结果,您可以使用例如Vincenty's formulae,它假设地球是一个椭球体,但它比大圆距离更难实现。要获得更准确的结果,您应该考虑当地的地形,这更难。