在 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:
6.9 6.90000000000000000000 + 0.00000000000000088818 = 6.90000000000000000000
尽管 i 在调试器中显示为 6.89999999999999946709,但在应用格式之前,C# 格式会将值四舍五入到 15 位有效十进制数字。
这种意外行为是因为 .NET在内部使用二进制表示形式存储双精度数。在格式化之前,.NET 会将双精度数转换为十进制字符串,这本质上会引入舍入误差。
要避免此问题,可以:
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
以上是为什么 C# 和 C 在格式化双精度数时产生不同的输出?的详细内容。更多信息请关注PHP中文网其他相关文章!