为了账号安全,请及时绑定邮箱和手机立即绑定

Go float64 不适用于纬度和经度

Go float64 不适用于纬度和经度

Go
智慧大石 2021-10-18 09:50:45
我试图从一个 json 对象中精确解析纬度和经度,我选择了 float64 来完成这项工作。然而, float64 以某种方式四舍五入这个数字,我不知道该怎么做才能避免四舍五入。我创建了一个快速片段,以便您可以执行问题:http : //play.golang.org/p/9g6Imn-7GKpackage mainimport (    "encoding/json"    "fmt"    "reflect")type Position struct {    Lat float64 `json:"lat"`    Lon float64 `json:"lon"`}func main() {    s := `{"lat":13.519004709972312,"lon": -13.519004709972312}`    pos := Position{}    json.Unmarshal([]byte(s), &pos)    if !reflect.DeepEqual(s, &pos) {        fmt.Printf("\nExpected %#v\nbut got  %#v", s, pos)    }}
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

一个实用的解决方案:

没做什么。

数字的差异大约是单个小原子宽度的十分之一,您的测量不可能那么精确。

小数点后第 8 位(数字中有 15 个)代表大约 1.1 毫米的距离。我怀疑你的测量是否准确到这个程度,还有更多的事情变得非常愚蠢。小数点后第 5 位大约为 1.1m,在正常范围内,不受浮点错误的影响。

十进制度数的维基百科页面可能有助于确定哪些值对您的项目是合理的。

一些考虑:

有两个潜在的问题在起作用:

  1. 浮点数

    一些可能阐明浮点问题的阅读:

    如果您阅读这些内容并了解浮点在实践中的工作原理,您可能会有所启发,并了解正在发生的事情以及如何解决它。

    • 每个程序员都应该了解的关于浮点运算的知识,或者为什么我的数字不相加?

    • 每个计算机科学家都应该了解的关于浮点运算的知识

  2. 测量精度

    在我看来,这是更大的问题。您发布的一个号码是13.519004709972312,显示为13.519004709972313。无论该值是否“改变”(见:1),我试图计算这些返回值之间的差异的每个软件计算器0,这是指示性的。

    手工计算显示0.000000000000001值的差异。也就是说,在尾随 1 之前有 14 个零,或者1^-15

    纬度上的维基百科页面说:

    球体上纬度1度的子午线长度为111.2公里

    从这里往回推算,纬度中小数点后 15 位代表的位置差异对应于大约 0.00000011mm或 0.11 纳米的距离

    来自 The Physics Factbook's Diameter of an Atom页面:

    一个原子比人类最粗的头发还要小一百万倍。原子的直径范围从大约 0.1 到 0.5 纳米

    因此,您的测量值最多会“偏离”单个原子直径的 1/10。

    即使我所有的计算都偏离了一百万或十亿倍,距离仍然小到在实践中无关紧要!


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信