Golang math / big Unmarshal Lost Precision

时间:2016-05-02 03:41:09

标签: go bigdecimal unmarshalling

我有一个结构:

type Msg struct {
    F1  *big.Float `json:"F1,string"`
}

然后我从消息队列中的json收到一条消息,然后我想将该json消息解组到我的Msg结构中:

// jsonMsg = {"F1": "1000314.451234"}
var msg Msg
json.Unmarshal(jsonMsg, &msg)

但我得到了:

fmt.Println("go object:",msg.F1.String()) // 1000314.45, precision lost

因此,当我的字符串"1000314.451234"被解组为golang中的Msg对象时,精度会丢失。我想知道这是不是错误?我怎样才能获得完整的精度?感谢。

1 个答案:

答案 0 :(得分:3)

解组时精度不会丢失。将Float转换为String以将其打印时,它“丢失”。

package main

import (
    "fmt"
    "encoding/json"
    "math/big"
)

type Msg struct {
    F1  *big.Float `json:"F1,string"`
}

func main() {
    jsonMsg := []byte(`{"F1": "1000314.451234"}`)
    var msg Msg
    json.Unmarshal(jsonMsg, &msg)
    fmt.Println("go object:",msg.F1.String())
    fmt.Printf("go object: %f", msg.F1)
}

此测试的输出将为:

go object: 1000314.451
go object: 1000314.451234

所以只需依赖打印数据的方式。 Godoc fmt printing