在 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 會將雙精度數轉換為十進位字串,這本質上會引入舍入誤差。
利用 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.9000000000000003552713678800500929355621337890625DoubleConverter 使用範例:
以上是為什麼 C# 和 C 在格式化雙精度數時產生不同的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!