Maison > développement back-end > Golang > Pourquoi la conversion de float64 en int dans Go produit-elle des résultats inattendus ?

Pourquoi la conversion de float64 en int dans Go produit-elle des résultats inattendus ?

Patricia Arquette
Libérer: 2024-12-14 22:11:12
original
749 Les gens l'ont consulté

Why Does Converting float64 to int in Go Produce Unexpected Results?

Erreur lors de la conversion de float64 en int dans Go

Introduction

La conversion de nombres à virgule flottante (float64) en entiers (int) dans Go peut entraîner résultats inattendus en raison des limites de la représentation à virgule flottante.

Comprendre le Problème

Les nombres décimaux comme 100,55 ne peuvent pas être représentés avec précision en utilisant un nombre fini de bits en binaire, la représentation interne utilisée par les ordinateurs. Les valeurs Float64 dans Go sont conformes à la norme IEEE-754, qui utilise 53 bits pour la partie fractionnaire. Cela signifie que 100,55 est approximé du nombre binaire représentable le plus proche, ce qui entraîne de légères divergences.

Exemple

Considérez le code suivant :

package main

import "fmt"

func main() {
    x := 100.55
    fmt.Println(x - float64(int(x)))
}
Copier après la connexion

L'exécution de ce code imprimera :

0.5499999999999972
Copier après la connexion

au lieu de l'attendu 0.55.

Solution

Formateurs de chaînes (fmt.Printf)

Une façon de gérer cet écart consiste à arrondir le nombre à virgule flottante à la précision souhaitée avant l'impression.

package main

import "fmt"

func main() {
    x := 100.55
    fmt.Printf("%.2f\n", x)
}
Copier après la connexion

Ce code prints :

0.55
Copier après la connexion

Représentation à virgule flottante

Une autre approche consiste à éviter complètement d'utiliser des nombres à virgule flottante. Par exemple, pour représenter des montants en dollars, vous pouvez utiliser des cents comme nombres entiers et augmenter par 100 lors de l'affichage.

cents := 10055
fmt.Printf("%d.%d $\n", cents/100, cents%100)
Copier après la connexion

Ce code s'imprime :

100.55 $
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal