Maison >développement back-end >C++ >Pourquoi C# et C produisent-ils une sortie différente lors du formatage des 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);
a produit le résultat suivant :
6.900000 6.89999999999999946709 + 0.00000000000000088818 = 6.90000000000000035527
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));
a cédé :
6.9 6.90000000000000000000 + 0.00000000000000088818 = 6.90000000000000000000
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 :
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
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!