将数字从 float64 转换为 Int64 不正确



我尝试编写一个函数,代码:

package main
import (
"encoding/json"
"fmt"
)
type Test struct {
Data map[string]interface{} `json:"data"`
}
func main() {
jsonStr := "{"data": {"id": 999804707614896129}}"
t := &Test{}
json.Unmarshal([]byte(jsonStr), t)
fmt.Println(int64(t.Data["id"].(float64)))
var x float64 = 999804707614896129
fmt.Println(int64(x))
}

结果如下:

999804707614896128
999804707614896128

为什么结果是999804707614896128的,而不是999804707614896129的。

因为999804707614896129不能用类型为float64的值精确表示。float64使用 IEEE 754 标准来表示浮点数。这是一种精度有限的格式(大约 16 个十进制数字(。

如果需要"传输"确切的数字,请使用字符串而不是 JSON 数字。如果数字"适合"int64,您将能够"完全"解析它(否则只需将其用作string或使用big.Int(:

jsonStr := `{"data": {"id": "999804707614896129"}}`
t := &Test{}
if err := json.Unmarshal([]byte(jsonStr), t); err != nil {
panic(err)
}
s := t.Data["id"].(string)
fmt.Println(s)
var x int64
x, err := strconv.ParseInt(s, 10, 64)
fmt.Println(x, err)

这将输出(在Go Playground上尝试(:

999804707614896129
999804707614896129 <nil>

最新更新