2016-05-02 13 views
3

は私が持っているように、構造体:私は私のMsg構造体にそのJSONメッセージを非整列化したいその後、メッセージキューからjsonにメッセージを持って、その後Golang数学/ビッグ非整列化ロスト精密

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

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

しかし、私は得た:

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

ので精度がLoであります私の文字列"1000314.451234"がゴーランのMsgオブジェクトにアンマーシャリングされているとき。これがバグなのだろうか?どのように完全精度を得ることができますか?ありがとう。

答えて

4

アンマーシャリングすると精度が失われません。 Floatを文字列に変換して印刷すると、「失われた」状態になります。

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

+2

はい。デフォルトでは、string関数はmsg.Text( 'g'、10)を使用するため、精度が失われたように見えます。 "fmt.Println(" go object: "、msg.F1.Text( 'f'、6))"は、失われていないことがわかります。 私も同じことを投稿しようとしていましたが、あなたは私にそれを打ち負かしました。 – khrm

関連する問題