【问题标题】:Java double vs BigDecimal for latitude/longitude纬度/经度的 Java double vs BigDecimal
【发布时间】:2011-07-19 22:27:45
【问题描述】:

当存储通常采用以下格式的纬度/经度时:44.087585(即点前最多 2 个数字和 6dp)我需要使用大小数吗?

【问题讨论】:

  • 与问题无关,但经度值的范围从 -180 到 180,因此点前有 3 个数字。还有一个潜在的减号:P

标签: java double geospatial latitude-longitude bigdecimal


【解决方案1】:

使用double 具有足够的精度,可以将纬度/经度精确到小数点后 6-7 位的英寸。在航空领域,如果使用十进制度,它们通常至少保留 7 个小数位。在我们的 NASA 模拟中,纬度/经度数据是doubles,而所有其他姿态和高度都是浮动的。换句话说,高度的第 6 位小数并不重要,而 lat/lon 的第 6 位是亚英尺精度。如果您需要精确到亚英尺,则不应使用 float 表示纬度/经度。

您可以在 Google 地球中四处游荡,通过放置标记和操作最后一位小数来查看您获得的准确度。

【讨论】:

  • +1 可以很好地解释相对于对数/纬度的小数点精度。
【解决方案2】:

double 对于纬度/经度应该没问题。 BigDecimal 一旦您开始操纵货币或需要对精度有更多控制权,就会变得更加重要。

【讨论】:

  • 投反对票:为什么投反对票?随意发表评论 - 它会让你看起来很合理。
【解决方案3】:

double 具有足够的精度来存储它。但是,在向用户显示时,请使用%.6f 之类的格式字符串,这样您就不会打印出垃圾数字。

【讨论】:

    【解决方案4】:

    如果您关心精度,您可能应该选择BigDecimal for lots of reasons covered in this post。也就是说,doublefloat 应该可以很好地存储您需要的内容,以便能够满足您需要的值范围。

    我认为 doublefloat 不会让您失望,但如果您开始以任何方式汇总这些值,那么细微的不精确性就会开始累加。

    【讨论】:

      【解决方案5】:

      存储为 double 的最差精度约为 3 nm。

      如果你想用 Java 计算它:

      Math.ulp((double) 180) * 60 * 1852
      
      3.1582203519064933E-9
      

      作为奖励;存储在花车中的最差精度是 1.7 米。

      【讨论】:

      • 我刚刚意识到我还需要在另一个方向上制作具有最大错误的毕达哥拉斯。所以差一点。 :)
      【解决方案6】:

      如果您想使用纳米 GPS 控制纳米机器人的纳米旅行,请选择 BigDecimal。否则 - float/double 就足够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 2021-10-10
        • 2012-05-19
        相关资源
        最近更新 更多