float 和 double 数据类型是不是适合存储纬度和经度? [复制]

Posted

技术标签:

【中文标题】float 和 double 数据类型是不是适合存储纬度和经度? [复制]【英文标题】:float and double datatype is good to store latitude and longitude? [duplicate]float 和 double 数据类型是否适合存储纬度和经度? [复制] 【发布时间】:2014-01-06 13:46:25 【问题描述】:

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

为了存储这些值,我在服务器端使用 float 和 double 数据类型。我知道 float 和 double 不是推荐的原始数据类型(不建议以专业的方式使用货币),因为 float 和 double 存在舍入精度问题

就我而言,我只是比较服务器端存储的坐标(纬度和经度)。

问题 1:

将坐标与数据类型(float 或 double)进行比较会在将来产生任何问题吗?

问题 2:

使用大小数好不好?还是使用 float 或 double 更安全?

【问题讨论】:

6 个小数位(浮点数的最大精度)就足够了。见gis.stackexchange.com/a/8674 @JarrodRoberson 这个问题是关于 Java 的,另一个问题是关于 mysql 的。那么这个问题怎么可能是重复的呢? 【参考方案1】:

您不必对经度或纬度值进行任何舍入,因此请使用您想要的任何一个。 Double 更精确,所以让它成为您决定中最重要的因素。

您的 long/lat 值需要多少精度?

为了在地图上精确定位,您可能希望查看大小数,但对于模糊值,浮点数就足够了。

【讨论】:

可能需要 20 位数。但不确定。根据我的观察,情况就是这样。当然,我没有做任何舍入操作。我只是在检查以下条件 if((swLat = lattitude) && (neLng >= longtitude)) ... 如果我用双精度实现,则条件是工作正常。但害怕使用它,因为我需要准确性。对于我的情况,使用 Double 是一个理想的选择?【参考方案2】:

这不是安全问题,而是精度问题。 我不会考虑花车,但我认为双打是理想的。 你只需要看看你能从双精度中得到的最精确度是多少,看看它是否符合常规的经度/纬度值。我认为这已经足够了。

Else BigDecimal 只是您问题的一个简单后门,如果您想要更精确,请使用它

【讨论】:

出于好奇,想知道双精度可以处理多少。根据我的观察,它可以处理 14 位精度(就我而言)。所以我认为这对我有好处。如果 double 可以处理超过 20 位数字,那么 double 将是我的应用程序的理想选择。请提出您的建议。 取决于您使用的 java,双原始数据类型为 64 位长,当然正弦为 1 位等。您可以在此处找到有关精度的信息:docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3 非常感谢您的宝贵指导。【参考方案3】:

您应该从您想要的the accuracy 开始。一旦确定了这一点,就可以选择合适的数据类型。

如果您认为 5 位小数 (1.1132 m) 的精度就足够了,您可以轻松地使用float。您的计算需要越准确,您应该越倾向于使用double 并最终使用BigDecimal

在比较浮点数时,您还应该结合必要的精度。

【讨论】:

这个答案+1。检查此链接以了解您需要的精度en.wikipedia.org/wiki/… 1度的纬度或经度约为111km。另外:double l = -179.123456789; System.out.println((float)f); 打印:-179.15346,那么只有使用“float”(4 字节)编码时,您才能估计大约 1m 的精度 通常我不希望智能手机中的(民用)GPS 比 1m 更精确,因此在大多数情况下浮动应该没问题。

以上是关于float 和 double 数据类型是不是适合存储纬度和经度? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

数据库操作

java 变量数据类型转换?byte, short, char, int, long, float, double

JAVA数据类型

Java中不同类型数据是不是可以运算?例如:单精度和int类型是不是可以直接相加?

在java中的double和float类型数据相除为啥可以除以零

float和double有啥区别?