首頁 >後端開發 >C++ >為什麼 C# 和 C 在格式化雙精度數時產生不同的輸出?

為什麼 C# 和 C 在格式化雙精度數時產生不同的輸出?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-04 19:27:44403瀏覽

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

在 C# 中格式化雙精度數

在最近的實驗中,嘗試在 C# 中模擬 C 的輸出格式化功能。然而,預期輸出與實際輸出之間存在差異。

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);

產生以下輸出:

6.900000
6.89999999999999946709
+ 0.00000000000000088818
= 6.90000000000000035527

C# code:

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));

yield:C# code:

6.9
6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000

yield:

儘管i 在調試器中顯示為6.89999999999999946709,但在套用格式之前,C# 格式會將數值四捨五入至 15 位元有效十進位數字。

這種意外行為是因為 .NET在內部使用二進位表示形式儲存雙精度數。在格式化之前,.NET 會將雙精度數轉換為十進位字串,這本質上會引入舍入誤差。
  • 要避免此問題,可以:
  • 存取精確的小數double 的值: 透過擷取內部二進位位元建構十進位值的字串表示形式手動。
使用自訂格式化庫:

利用 Jon Skeet 的 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
DoubleConverter 使用範例:

以上是為什麼 C# 和 C 在格式化雙精度數時產生不同的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn