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
410 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!

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