Conserver les zéros de fin dans les nombres à virgule flottante marshalés JSON
Dans Go, la fonction json.Marshal() supprime souvent les zéros de fin du flottant -numéros de points lors du triage. Cela peut entraîner une perte de précision dans certains scénarios.
Problème :
Lors du regroupement de la valeur d'un programme Go avec un zéro final (par exemple, 40,0), json.Marshal () affiche la valeur sans le zéro (par exemple, 40). Ce comportement peut être problématique si des programmes externes attendent des nombres à virgule flottante avec des zéros à droite.
Solution 1 (recommandée) : utiliser un type flottant personnalisé
Définir un flottant personnalisé tapez et implémentez la méthode MarshalJSON() pour contrôler la sérialisation JSON. Voici un exemple :
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 }
Dans ce type personnalisé, la méthode MarshalJSON() convertit le float en une chaîne avec une décimale (s'il s'agit d'un nombre entier) ou conserve toutes les décimales (s'il ne s'agit pas d'un nombre entier). nombre entier).
Exemple :
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) }
Ce code génère {"Value":40.0,"Unit":"some_string"}
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!