浮点数和双精度数据类型适合存储纬度和经度吗?

24

我在服务器端(JAVA平台)存储了纬度和经度。

为了存储这些值,我在服务器端使用了浮点和双精度数据类型。我发现浮点和双精度不是推荐的原始数据类型(不推荐在专业方式中使用货币),因为浮点和双精度存在四舍五入精度问题

在我的情况下,我只是在服务器端比较存储的坐标(纬度和经度)。

问题1:

将数据类型(float或double)与坐标进行比较会在未来造成问题吗?

问题2:

使用BigDecimal好吗?还是使用浮点或双精度更安全?


6位小数(这是浮点数的最大精度)已经足够了。请参见http://gis.stackexchange.com/a/8674 - Martin
1
@JarrodRoberson 这个问题是关于Java的,另一个问题是关于MySQL的。那么这个问题怎么可能是重复的呢? - user247702
3个回答

34

您应该从所需的精度开始。一旦确定了精度,您可以选择适合的数据类型。

如果您决定5个小数位(1.1132米)的精度足够,那么可以轻松使用float。如果您需要更高的计算精度,则应使用double,甚至是BigDecimal

在比较浮点数时,您应考虑必要的精度。


4
请将英语翻译成中文。仅返回翻译后的文本:+1 以作答案的奖励。请查看此链接,以了解您需要的精度要求 http://en.wikipedia.org/wiki/Wikipedia%3AWikiProject_Geographical_coordinates#Precision - MrUpsidown
1
一度纬度或经度约为111公里。此外:double l = -179.123456789; System.out.println((float)f); 输出:-179.15346,如果您使用“float”(4字节)编码,则只能估计约1米的精度。 - Bruno L.
通常我不期望智能手机上的(民用)GPS精度高于1米,所以对于大多数情况,浮点数应该足够了。 - FrankKrumnow

21

这不是关于安全的问题,而是关于精度的问题。 我不会考虑使用浮点数,但我认为双精度浮点数在这里是最理想的。 你只需要看看双精度浮点数可以提供多大的精度,并查看它是否适用于常规的经度/纬度值。我认为这已经足够了。

否则,BigDecimal就是解决你问题的简单方法,如果你需要更高的精度,可以使用它。


2
好奇心驱使我想知道 double 可以处理多少位精度。根据我的观察,它可以处理14位精度(在我的情况下)。所以我认为这对我来说已经足够了。如果 double 可以处理超过20位的精度,那么 double 将是我应用程序的理想选择。请给出您的建议。 - ArunRaj
根据您使用的Java版本,双精度原始数据类型长度为64位,当然有1位用于正负号等。您可以在此处找到有关精度的信息:http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3 - ThaBomb
非常感谢您宝贵的指导。 - ArunRaj

4

你不需要对经度或纬度值进行任何四舍五入,因此可以使用任何一个。double类型更精确,因此这应该是您决策的最重要因素。

您的经/纬度值需要多少精度?

对于地图上的精确定位,您可能需要考虑big decimal,但对于模糊值,float已经足够好了。


1
可能需要20位数字,但不确定。根据我的观察,这是情况。当然,我没有进行任何舍入操作。我只是检查以下条件:如果((swLat <= lattitude) && (swLng <= longtitude) && (neLat >= lattitude) && (neLng >= longtitude)) ... 如果我使用double实现,条件就可以正常工作。但是我担心使用它,因为我需要精度。对于我的情况来说,使用Double是一个理想的选择吗? - ArunRaj

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