簡體   English   中英

Visual Studio 2008單元測試一直在失敗

[英]Visual studio 2008 unit test keeps failing

我創建了一種基於雙精度列表計算調和平均值的方法。 但是當我運行測試時,即使輸出結果相同,它仍然會失敗。

我的調和方法:

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>。

對我而言,兩者都是相同的價值觀。

有人可以解釋一下嗎? 或者我做錯了什么?

Assert.AreEqual的雙重過載采用“delta”參數來允許雙精度不精確。 您應該為此參數指定一個小值。

你很難說服GetHarmonicMean方法完全返回2.32432293165495。 Double比14位小數精確得多。 您的結果可以是例如:

2.32432293165495 - your_result = 0.0000000000000000012345 ... - 這絕對不是零。

雙值在顯示時被舍入,因此它們顯示的數字不足其容量限制(以防止出現舍入錯誤)。 雖然值看起來相同,但它們實際上沒有完全相同的值。

您可以計算該值,然后使用往返格式顯示它:

value.ToString("r")

當解析以這種方式創建的文本表示時,保證生成創建它的相同double值。 你可以把它放在代碼中,它會給你一個完全匹配。

但是,一般情況下,不應將雙重值進行比較以獲得完全相等,因為您很少遇到像這樣的情況,您需要完全匹配。 此外,在這種情況下,測試完全匹配可能不是您真正想要的,因為它取決於實現保持完全相同。 如果您使用不同的算法,則會產生不同的舍入誤差,從而產生略微不同的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM