代码之家  ›  专栏  ›  技术社区  ›  Corey Ogburn

C.NET双版…6.8!= 6.8?

  •  2
  • Corey Ogburn  · 技术社区  · 14 年前

    我在工作中做了一些单元测试,其中一个断言突然出现了一个特殊的错误。请注意,ExpectedValue和ActualValue都是双精度值。

    Assert.AreEqual(expectedValue, actualValue);
    

    例外说明它们不相等,并详细说明“预期值:<6.8>实际值:<6.8>。”

    预期值是硬编码的6.8,实际值是通过我们的分类方法(如相等记录或Jenks自然中断)使用数据库值制定的。

    我的猜测是,两个值的尾数可能是相似的,直到最低有效位为止。我更新了测试以包含一个epsilon,以确定这两个值是否足够接近,但是我很好奇是否有一种方法可以强制尾数与显示值(如果我显示了那个双精度数)匹配。这样的尾数修正是否存在?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jon Skeet    14 年前

    我不完全确定你强迫尾数匹配显示值是什么意思…那里 例如,没有精确为0.1的双精度值。

    如果需要一些代码来显示 准确的 但是,我有一个 DoubleConverter.cs 文件,方便:

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

    另一种选择是在将double转换为string时使用往返格式说明符(“r”)——这保证了结果具有足够的信息,可以在以后复制相同的精确值。换句话说,如果 x != y 然后 x.ToString("r") != y.ToString("r") .

        2
  •  1
  •   Henk Holterman    14 年前

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

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

        3
  •  0
  •   Stephen Cleary    14 年前

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

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