Golang数学/大元帅失去精度

I have a struct like:

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

Then I got a message in json from a message queue and then I want to unmarshal that json message into my Msg struct:

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

But I got:

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

So the precision is lost when my string "1000314.451234" is unmarshaled to a Msg object in golang. I wonder if this is bug? How can I get the full precision? Thanks.

The precision is not lost when you unmarshall. It's "lost" when you convert the Float to String to print it.

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)
}

The output of this test will be :

go object: 1000314.451
go object: 1000314.451234

So just depend how you print the data. Godoc fmt printing