【问题标题】:How to Output a Double Value with all the Decimal Places in Debugger or Console如何在调试器或控制台中输出包含所有小数位的双精度值
【发布时间】:2011-01-19 07:18:01
【问题描述】:

我希望在调试应用程序时完全提取double 值,以便我可以使用它来构建一个测试用例以输入我的几何算法。

如何提取double 值-- 精确到C# 中double 数据类型允许的最后一位小数-- 并在调试器窗口或使用Console.WriteLine 命令输出?

编辑:我的问题是,只有当我坚持输入整个双精度值时,将双精度值作为输入的算法才会失败,一直到最后一位。而且由于我想在测试用例中重现它,这就是为什么我需要如此完整的双值表示。

【问题讨论】:

  • 使用Console.WriteLine会发生什么?
  • @Drackir,我的测试用例最多只能显示 10 位小数,即使它有超过 30++ 位小数。

标签: c# visual-studio-2008


【解决方案1】:

我有一个DoubleConverter class,它正是你想要的,听它的声音。像这样使用它:

string text = DoubleConverter.ToExactString(doubleValue);

您需要确保您理解,仅仅因为输出具有大量数字,并不意味着它具有那么多精度。您可能想阅读我在 binary floating point in .NET 上的文章以了解更多信息 - 当然,您可能一开始就知道所有这些。

请注意,如果您只想要一个可以往返的字符串值,则不需要任何额外的代码 - 只需使用“r”格式说明符:

string text = doubleValue.ToString("r");

我同意 Jackson Pope 在测试的相等比较中使用容差的一般方法,但我确实发现有时查看双精度表示的确切值很有用。它可以更容易理解为什么特定的计算会以某种方式出现。

【讨论】:

  • 真的让我吃惊的是,C# 无法完成它,我们不得不求助于编写自己的类来处理它。
  • @Graviton:好吧,C# 并没有对此做太多说明……您更受 .NET 库的困扰。而且这不是常见的要求 - 因为通常您应该对一般大小而不是超出可用精度的确切值感兴趣。
  • 我已经测试了你的代码——但我不太确定它是否有效。这是我的测试代码:double aat = 23445.4364487567676445433642536544656;string text = DoubleConverter.ToExactString(aat);Console.WriteLine(text);', and the string I got is "23445.43644875676909578032791614532470703125"`。它们不一样。
  • 我的问题是,只有当我坚持输入整个 double 值(一直到最后一位)时,将 double 值作为输入的算法才会失败。
  • 将这两个代表 Double 数字的字符串“23445.4364487567676445433642536544656”和“23445.43644875676909578032791614532470703125”解析为 Double 值,得到完全相同的值。我已经通过评估 System.Double.Parse("23445.4364487567676445433642536544656").ToString("r") 来测试这两种情况。所以 DoubleConverter 工作正常。
【解决方案2】:

不要尝试将二进制数作为十进制数输出到非常多的小数位并进行精确比较,而是与您可以接受的错误 epsilon 值进行比较,并将 epsilon 设置为非常小。例如

 double epsilon = Math.Abs(actual - expected);
 Assert.That(epsilon, Is.LessThan(0.000000000001);

【讨论】:

  • 对于许多应用程序,您的建议是最好的。我和OP在同一条船上。我有一个数值算法,在极少数情况下会进入无限循环。当问题出现时,我在调试器中暂停并检查输入参数。但是,当我使用这些值创建 NUnit 案例时,它不会无限循环。 VS 正在对结果进行四舍五入,四舍五入的值不存在问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 2022-10-01
  • 1970-01-01
  • 2015-03-20
相关资源
最近更新 更多