我正在尝试从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可能有助于确定哪些值适合您的项目。
一些注意事项:
有两个潜在的问题在起作用:
一些可能揭示浮点问题的读物:
如果您阅读了这些内容,并了解了浮点如何工作,
练习,您可能会开悟,并了解正在发生的事情
以及如何解决它。
我认为这是更大的问题。您发布的一个号码是
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/