![](/img/trans.png)
[英]Unit test multi thread environment with breakpoints in 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.