Visual Studio 2008单元测试一直在失败

时间:2010-04-23 13:01:26

标签: c# unit-testing

我创建了一个根据双精度列表计算调和平均值的方法。 但是当我运行测试时,即使输出结果相同,它也会一直失败。

我的调和方法:

public static double GetHarmonicMean(List<double> parameters)
{
    var cumReciprocal = 0.0d;
    var countN = parameters.Count;

    foreach( var param in parameters)
    {
        cumReciprocal += 1.0d/param;
    }

    return 1.0d/(cumReciprocal/countN);
}

我的测试方法:

[TestMethod()]
public void GetHarmonicMeanTest()
{
    var parameters = new List<double> { 1.5d, 2.3d, 2.9d, 1.9d, 5.6d };
    const double expected = 2.32432293165495; 
    var actual = OwnFunctions.GetHarmonicMean(parameters);
    Assert.AreEqual(expected, actual);
}

运行测试后,显示以下消息:

Assert.AreEqual失败。预期:其中2.32432293165495取代。实际:&lt; 2.32432293165495&gt;。

对我而言,两者都是相同的价值观。

有人可以解释一下吗?或者我做错了什么?

3 个答案:

答案 0 :(得分:7)

Assert.AreEqual的双重过载采用“delta”参数来允许双精度不精确。您应该为此参数指定一个小值。

答案 1 :(得分:1)

你很难说服GetHarmonicMean方法完全返回2.32432293165495。 Double比14位小数精确得多。您的结果可以是例如:

2.32432293165495 - your_result = 0.0000000000000000012345 ...... - 这绝对不是零。

答案 2 :(得分:1)

双值在显示时会四舍五入,因此它们会显示几个数字,而不是其容量限制(以防止出现舍入错误)。虽然值看起来相同,但它们实际上没有完全相同的值。

您可以计算该值,然后使用往返格式显示它:

value.ToString("r")

当解析以这种方式创建的文本表示时,它保证生成创建它的相同double值。你可以把它放在代码中,它会给你一个完全匹配。

但是,一般情况下,不应将双倍值进行比较以确保完全相等,因为您很少遇到像这样的情况,您实际上想要完全匹配。此外,在这种情况下,测试完全匹配可能不是您真正想要的,因为它取决于实现保持完全相同。如果你使用不同的算法,它会产生不同的舍入误差,结果略有不同。