2012-08-09 108 views
1

我正在測試方差(單元)方法,但出現雙重問題。單元測試雙數字失敗

public double Variance() 
    { 
     return Probablity * (1 - Probablity); 
    } 

    [Test] 
    public void Variance_WithSuccessProbablity02_Returns016() 
    { 
     var bernoulli = new BernoulliDistribution(0.2); 

     Assert.AreEqual(bernoulli.Variance(), 0.16); 
    } 

該測試結果是返回失敗。 失敗:預期:0.160000000000003d但是0.16d

+1

現在真正的筆記:什麼是你的問題?您意識到這是一個「雙重問題」 - 您希望我們對此做些什麼? – 2012-08-09 09:40:29

+0

well'0.2d * 0.8d'不是0.16d! !但使用小數可以幫助解決這個問題 – V4Vendetta 2012-08-09 09:41:19

+0

解決方案是什麼? – bayramucuncu 2012-08-09 09:53:52

回答

2

在NUnit的,既可以比較浮動使用一個明確的公差點值:

Assert.AreEqual(double expected, double actual, double tolerance); 

或可以全局設置GlobalSettings.DefaultFloatingPointTolerance到一個非零值(默認爲0.0)。

有更多浮點比較信息here

在您的具體情況,我建議你試試這個:

Assert.AreEqual(bernoulli.Variance(), 0.16, 1.0e-9); 
1

當使用浮動或雙打時,經常出現這樣的精度問題。

您需要考慮到您的差異中的小「差異」(原諒雙關語)。

1
Assert.IsTrue(Math.Abs(bernoulli.Variance() - 0.16d) < 0.00001d);