Java中的double和BigDecimal在纬度/经度方面的应用差异

86

当存储通常格式为44.087585(即小数点前最多2个数字,小数点后6位)的纬度/经度时,是否需要使用bigdecimals?


2
问题无关紧要,但经度值的范围从-180到180,因此小数点前有3个数字。还有一个可能的负号:P - Tom Ladek
6个回答

201

使用double可以提供足够的精度,以便在6-7个小数位下实现准确到英寸级别的经纬度。在航空中,如果使用小数度,则通常至少会到第7位小数。在我们的NASA模拟中,经纬度数据是double类型,而所有其他姿态和高度则为float类型。换句话说,对于高度来说,第6位小数并不重要,而对于经纬度来说,第6位小数是用于亚英尺级别精度的关键。如果需要亚英尺级别的精度,则不应使用float来表示经纬度。

您可以在Google Earth中玩耍,通过放置标记并操作最后一位小数,来看看得到的精度。


11
感谢您对经度/纬度小数点精度的详细解释,我给你点赞。 - CoolBeans

41

double 可以用于表示纬度/经度,而 BigDecimal 更适用于处理货币或需要更为精确的计算。


12
下投票者:为什么要点踩?欢迎留下评论 - 这会让你看起来更加合理。 - CoolBeans

7

double具有足够的精度来存储这个数。但是,在向用户显示时,请使用格式字符串,例如%.6f,以避免输出无用数字。


6
如果你关心精度,建议使用 BigDecimal ,在这篇帖子中有很多原因进行了解释。 话虽如此, double float 应该足以存储您所需的值范围,并能够满足您的需求。
仅具有六位小数精度,我认为 double float 不会让你失望,但如果您开始以任何方式聚合值,则微小的不准确性可能会开始累加。

6

存储为双精度浮点数的最差精度约为3纳米。

如果您想在Java中进行计算:

Math.ulp((double) 180) * 60 * 1852

3.1582203519064933E-9

作为奖励,使用浮点数存储得到的最差精度为1.7米。

1
我刚意识到我还需要制作一个误差最大的勾股定理,以另一个方向。所以会稍微差一点。 :) - Gussoh

3

如果您想使用纳米GPS控制纳米机器人在其纳米旅行中移动,建议选择BigDecimal类型。否则,float/double类型已经足够。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接