Maison > développement back-end > Golang > Pourquoi Go Print 9.12 pour « 912 * 0.01 » mais 9.120000000000001 pour « float64(912) * 0.01 » ?

Pourquoi Go Print 9.12 pour « 912 * 0.01 » mais 9.120000000000001 pour « float64(912) * 0.01 » ?

Linda Hamilton
Libérer: 2024-12-16 15:33:15
original
414 Les gens l'ont consulté

Why Does Go Print 9.12 for `912 * 0.01` but 9.120000000000001 for `float64(912) * 0.01`?

Pourquoi l'écart entre deux float64 ?

Considérez les extraits Go suivants :

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)
Copier après la connexion

Bien que vous compreniez correctement que la deuxième ligne affiche 9.120000000000001, vous vous demandez peut-être pourquoi le la première ligne affiche 9.12 sans la fin ...01.

La réponse réside dans la gestion par Go des expressions constantes, telle que définie dans la spécification :

Les expressions constantes sont toujours évaluées exactement ; les valeurs intermédiaires et les constantes elles-mêmes peuvent nécessiter une précision nettement supérieure à celle prise en charge par tout type prédéfini dans le langage.

Étant donné que 912 * 0,01 est une expression constante, elle est évaluée avec une extrême précision. Cette même précision est conservée lors du passage du résultat de cette expression comme argument à fmt.Println(). Essentiellement, fmt.Println(912 * 0.01) se comporte comme s'il s'agissait de fmt.Println(9.12), où 9.12 est une représentation exacte de l'expression évaluée.

En revanche, lorsque vous convertissez explicitement 912 en float64 dans la deuxième ligne, les deux opérandes de la multiplication à virgule flottante sont implicitement convertis en float64. Puisque 0,01 ne peut pas être représenté avec précision dans float64, une perte de précision se produit, conduisant à la présence de ...01 dans la sortie.

Ainsi, la différence de résultats provient de la précision conservée lors de l'évaluation de l'expression constante et de l'implicite casting impliqué dans float64(912) * 0.01.

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