2010-04-23 129 views
4

我创建了一个基于双精度列表计算调和平均值的方法。 但是当我运行测试时,即使输出结果相同,它仍然会失败。Visual Studio 2008单元测试不成功

我的调和平均方法:

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>。实际:< 2.32432293165495>。

对我来说都是相同的值。

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

+1

有可能是一些四舍五入错误消息文本回事。在另一个说明中,你的方法可以使用Linq:'return 1.0d/parameters.Average(d => 1.0d/d));' – 2010-04-23 13:08:11

+0

很好,没想到用linq做这个。 – Gerbrand 2010-04-23 13:17:49

回答

7

为Assert.AreEqual双重载采用“增量”参数,以允许双打的不精确性。您应该为此参数指定一个小值。

1

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

2.32432293165495 - your_result = 0.0000000000000000... - 这绝对不是零。被显示时,他们

1

Double值被舍入,从而使它们显示短其能力的极限的几个数字(从显示出来保持舍入误差)。虽然这些值看起来相同,但它们实际上并不具有完全相同的值。

可以计算的值,然后利用往返格式显示出来:

value.ToString("r") 

当创建这样的文字表述进行解析,它保证生成创建它的双重价值。你可以把它放在代码中,它会给你一个精确的匹配。

但是,通常不应该比较两个值的精确相等性,因为您很少遇到像这样的情况,因为您很想要精确匹配。此外,测试完全匹配可能不是您在这种情况下实际需要的,因为它取决于实现完全相同。如果你使用不同的算法,它会给出不同的舍入误差,给出一个稍微不同的结果。

相关问题