我正在尝试从json对象精确地解析纬度和经度,并且我选择了float64作为工作。但是,float64会以某种方式四舍五入该数字,因此我不确定该如何避免四舍五入。

我创建了一个简短的代码段,以便您可以执行此问题:
http://play.golang.org/p/9g6Imn-7GK

package main

import (
    "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)
    }
}

最佳答案

实用的解决方案:

没做什么。

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

小数点后第八位(数字中有15个)表示大约1.1mm的距离。我怀疑您的测量是否准确到这个程度,还有其他事情变得越来越愚蠢。小数点后第五位约为1.1m,这是理智的范围,不受浮点错误的影响。

wikipedia page on Decimal Degrees可能有助于确定哪些值适合您的项目。

一些注意事项:

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

  • 浮点:

    一些可能揭示浮点问题的读物:
  • What Every Programmer Should Know About Floating-Point Arithmetic or Why don’t my numbers add up?
  • What Every Computer Scientist Should Know About Floating-Point Arithmetic

  • 如果您阅读了这些内容,并了解了浮点如何工作,
    练习,您可能会开悟,并了解正在发生的事情
    以及如何解决它。
  • 测量精度:

    我认为这是更大的问题。您发布的一个号码是13.519004709972312,显示为13.519004709972313。无论该值是否已“更改”(请参阅​​:1),我尝试计算的每个软件计算器都将返回的0返回这些值之间的差异,这是指示性的。

    手工进行计算会发现0.000000000000001的值有所不同。也就是说,尾随1或1^-15之前有14个零。

    wikipedia page on Latitude说:



    从此倒退,由纬度第15个小数位表示的位置差相当于大约0.00000011mm或0.11纳米的距离。

    在《物理概况》的Diameter of an Atom页面中:



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

    即使我的所有计算都相差一百万或十亿次,距离仍然很小,以至于在实践中都没有关系!
  • 关于go - Go float64不适用于经度和纬度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30784608/

    10-13 06:36