Maison > développement back-end > C++ > Pourquoi C# et C produisent-ils une sortie différente lors du formatage des doubles ?

Pourquoi C# et C produisent-ils une sortie différente lors du formatage des doubles ?

Mary-Kate Olsen
Libérer: 2025-01-04 19:27:44
original
456 Les gens l'ont consulté

Why Do C# and C Produce Different Output When Formatting Doubles?

Formatage des doubles pour la sortie en C#

Dans une expérience récente, une tentative a été faite pour émuler les capacités de formatage de sortie du C en C#. Cependant, des écarts ont été observés entre le résultat attendu et le résultat réel.

Le code C :

double i = 10 * 0.69;
printf("%f\n", i);
printf("  %.20f\n", i);
printf("+ %.20f\n", 6.9 - i);
printf("= %.20f\n", 6.9);
Copier après la connexion

a produit le résultat suivant :

6.900000
6.89999999999999946709
+ 0.00000000000000088818
= 6.90000000000000035527
Copier après la connexion

Le code C# :

double i = 10 * 0.69;
Console.WriteLine(i);
Console.WriteLine(String.Format("  {0:F20}", i));
Console.WriteLine(String.Format("+ {0:F20}", 6.9 - i));
Console.WriteLine(String.Format("= {0:F20}", 6.9));
Copier après la connexion

a cédé :

6.9
6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000
Copier après la connexion

Malgré mon apparition comme 6.899999999999999946709 dans le débogueur, le formatage C# arrondit la valeur à 15 chiffres décimaux significatifs avant d'appliquer le format.

Ce comportement inattendu est dû au fait que .NET stocke en interne les doubles à l'aide d'une représentation binaire. Avant le formatage, .NET convertit le double en chaîne décimale, ce qui introduit intrinsèquement une erreur d'arrondi.

Pour éviter ce problème, on peut soit :

  • Accéder à la décimale exacte valeur du double : Construire une représentation sous forme de chaîne de la valeur décimale en extrayant les bits binaires internes manuellement.
  • Utilisez une bibliothèque de formatage personnalisée : Tirez parti de la classe DoubleConverter de Jon Skeet, qui fournit des méthodes pour récupérer la valeur décimale exacte d'un double et arrondir la sortie à une précision spécifiée.

Exemple d'utilisation de DoubleConverter :

Console.WriteLine(DoubleConverter.ToExactString(i));
Console.WriteLine(DoubleConverter.ToExactString(6.9 - i));
Console.WriteLine(DoubleConverter.ToExactString(6.9));

// 6.89999999999999946709294817992486059665679931640625
// 0.00000000000000088817841970012523233890533447265625
// 6.9000000000000003552713678800500929355621337890625
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!

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