【问题标题】:C# .Net double issue... 6.8 != 6.8?C# .Net 双重问题... 6.8 != 6.8?
【发布时间】:2010-08-16 16:36:14
【问题描述】:

我在工作中进行了一些单元测试,其中一个断言出现了一个特殊的错误。请注意,expectedValue 和 actualValue 都是双精度值。

Assert.AreEqual(expectedValue, actualValue);

异常声明它们不相等,详细说明“预期值: 实际值:。”

预期值是硬编码的 6.8,而实际值是使用通过我们的分类方法(例如 Equal Records 或 Jenks Natural Breaks)的数据库值制定的。

我的猜测是,不同之处可能在于 2 个值的尾数在最低有效位之前是相似的。我更新了测试以包含一个 epsilon 以查找这两个值是否足够接近,但我很好奇是否有办法强制尾数与显示值匹配,如果我显示该双精度。这样的尾数校正是否存在?

【问题讨论】:

  • 人们没有正确阅读您的问题,您知道精确度是怎么回事,您只是在询问尾数如何更好地处理问题,对吧?
  • 我正在寻求一种可能的方法来重构尾数,以便它的值更接近它所显示的值。有点像 val = double.Parse(val.ToString());除非效率更高。

标签: .net floating-accuracy error-correction


【解决方案1】:

我不完全确定强制尾数与显示值相匹配是什么意思...没有例如,没有精确为 0.1 的双精度值。

如果您想要一些代码来显示双精度的 精确 值,但是,我有一个 DoubleConverter.cs 文件,这很容易:

 double d = 0.1;
 string x = DoubleConverter.ToExactString(d);

另一种选择是在将双精度数转换为字符串时使用往返格式说明符(“r”) - 这可以保证结果有足够的信息来在以后重现相同的精确值。换句话说,如果x != y,那么x.ToString("r") != y.ToString("r")

【讨论】:

  • 我的意思是我有 2 个不同的值,它们在 Visual Studio 中都显示为 6.8,但它们的确切表示不同。我如何确定哪一个更正确(如果可能的话)并让它们都以这种方式表示,以便平等检查成为现实?
【解决方案2】:

您可以将两者都转换为字符串:actualValue.ToString("0.000") 并比较这些字符串。

这可以与您的要求紧密匹配。

【讨论】:

    【解决方案3】:

    如果要测试默认显示值是否匹配,只需比较默认显示值即可:

    Assert.AreEqual(expectedValue.ToString(), actualValue.ToString());
    

    【讨论】:

      猜你喜欢
      • 2017-03-03
      • 2011-04-08
      • 2011-01-26
      • 1970-01-01
      • 2017-04-17
      • 2018-10-13
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多