ホームページ  >  記事  >  バックエンド開発  >  Go JSON でフロートをマーシャリングするときに末尾のゼロを保持する方法は?

Go JSON でフロートをマーシャリングするときに末尾のゼロを保持する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-24 06:12:10915ブラウズ

How to Preserve Trailing Zeros When Marshaling Floats in Go JSON?

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"} を出力し、保持します。 JSON 出力の末尾のゼロ。

以上がGo JSON でフロートをマーシャリングするときに末尾のゼロを保持する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。