JSON マーシャリングされた浮動小数点数の末尾のゼロを保持する
Go では、json.Marshal() 関数によって浮動小数点数から末尾のゼロが削除されることがよくあります。 -マーシャリング中のポイント番号。これにより、特定のシナリオでは精度が失われる可能性があります。
問題:
Go プログラムの値を末尾のゼロ (例: 40.0) でマーシャリングする場合、json.Marshal () はゼロを除いた値を出力します (例: 40)。外部プログラムが末尾にゼロの付いた浮動小数点数を想定している場合、この動作は問題となる可能性があります。
解決策 1 (推奨): カスタム Float 型を使用する
カスタム float を定義するMarshalJSON() メソッドを入力して実装し、JSON シリアル化を制御します。以下に例を示します。
type KeepZero float64 func (f KeepZero) MarshalJSON() ([]byte, error) { if float64(f) == float64(int(f)) { return []byte(strconv.FormatFloat(float64(f), 'f', 1, 32)), nil } return []byte(strconv.FormatFloat(float64(f), 'f', -1, 32)), nil }
このカスタム型では、MarshalJSON() メソッドは float を小数点以下 1 桁の文字列 (整数の場合) に変換するか、小数点以下のすべての桁を保持します (整数でない場合)。全体
例:
type Pt struct { Value KeepZero Unit string } func main() { data, err := json.Marshal(Pt{Value: 40.0, Unit: "some_string"}) fmt.Println(string(data), err) }
このコードは、{"Value":40.0,"Unit":"some_string"}
以上がGo JSON でフロートをマーシャリングするときに末尾のゼロを保持する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。