【发布时间】:2015-08-27 08:58:29
【问题描述】:
我正在尝试从一个 json 对象中精确解析纬度和经度,我选择了 float64 来完成这项工作。但是 float64 以某种方式对数字进行四舍五入,我不知道该怎么做才能避免四舍五入。
我创建了一个快速的 sn-p,以便您可以执行问题: 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)
}
}
【问题讨论】:
-
如果你想要比 float64 更高的精度,你应该使用
math/big。 -
我已经用完整的代码进行了编辑。谢谢
-
@JimB,不知道怎么做,你能用你的建议修改游乐场的例子吗?
-
如前所述,您可以(应该?)只使用 float64 并使用舍入。如果您有理由希望保留确切的字符串,
json.Number可能会有一些用处。 -
另外你必须问自己的问题是输入是如何生成的?如果在源头使用了双精度数字,那么最后的数字无论如何都不能被信任。您可以使用
float64可靠地表示最多 15 个十进制数字,但您的输入有 17 个。