我在服务器端(JAVA平台)存储了纬度和经度。
为了存储这些值,我在服务器端使用了浮点和双精度数据类型。我发现浮点和双精度不是推荐的原始数据类型(不推荐在专业方式中使用货币),因为浮点和双精度存在四舍五入精度问题。
在我的情况下,我只是在服务器端比较存储的坐标(纬度和经度)。
问题1:
将数据类型(float或double)与坐标进行比较会在未来造成问题吗?
问题2:
使用BigDecimal好吗?还是使用浮点或双精度更安全?
我在服务器端(JAVA平台)存储了纬度和经度。
为了存储这些值,我在服务器端使用了浮点和双精度数据类型。我发现浮点和双精度不是推荐的原始数据类型(不推荐在专业方式中使用货币),因为浮点和双精度存在四舍五入精度问题。
在我的情况下,我只是在服务器端比较存储的坐标(纬度和经度)。
问题1:
将数据类型(float或double)与坐标进行比较会在未来造成问题吗?
问题2:
使用BigDecimal好吗?还是使用浮点或双精度更安全?
您应该从所需的精度开始。一旦确定了精度,您可以选择适合的数据类型。
如果您决定5个小数位(1.1132米)的精度足够,那么可以轻松使用float
。如果您需要更高的计算精度,则应使用double
,甚至是BigDecimal
。
在比较浮点数时,您应考虑必要的精度。
double l = -179.123456789; System.out.println((float)f);
输出:-179.15346
,如果您使用“float”(4字节)编码,则只能估计约1米的精度。 - Bruno L.这不是关于安全的问题,而是关于精度的问题。 我不会考虑使用浮点数,但我认为双精度浮点数在这里是最理想的。 你只需要看看双精度浮点数可以提供多大的精度,并查看它是否适用于常规的经度/纬度值。我认为这已经足够了。
否则,BigDecimal就是解决你问题的简单方法,如果你需要更高的精度,可以使用它。
你不需要对经度或纬度值进行任何四舍五入,因此可以使用任何一个。double类型更精确,因此这应该是您决策的最重要因素。
您的经/纬度值需要多少精度?
对于地图上的精确定位,您可能需要考虑big decimal,但对于模糊值,float已经足够好了。