首页 > 后端开发 > C++ > 为什么 C# 和 C 在格式化双精度数时产生不同的输出?

为什么 C# 和 C 在格式化双精度数时产生不同的输出?

Mary-Kate Olsen
发布: 2025-01-04 19:27:44
原创
410 人浏览过

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:

6.9
6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000
登录后复制

尽管 i 在调试器中显示为 6.89999999999999946709,但在应用格式之前,C# 格式会将值四舍五入到 15 位有效十进制数字。

这种意外行为是因为 .NET在内部使用二进制表示形式存储双精度数。在格式化之前,.NET 会将双精度数转换为十进制字符串,这本质上会引入舍入误差。

要避免此问题,可以:

  • 访问精确的小数double 的值: 通过提取内部二进制位构造十进制值的字符串表示形式手动。
  • 使用自定义格式化库:利用 Jon Skeet 的 DoubleConverter 类,该类提供了检索双精度型的精确十进制值并将输出四舍五入到指定精度的方法。

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板