2010-04-23 6 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));' –

+0

Отлично, не думал об этом с linq. – Gerbrand

ответ

7

Двойная перегрузка для Assert.AreEqual принимает параметр «delta», чтобы допускать неточность удвоения. Вы должны указать небольшое значение для этого параметра.

1

Это очень сложно убедить метод GetHarmonicMean точно вернуть 2.32432293165495. Двойной гораздо точнее, чем 14 знаков после запятой. Ваш результат может быть, например:

2.32432293165495 - your_result = 0.000000000000000000... - это определенно не равно нулю.

1

Двойные значения округляются, когда они отображаются, так что они отображают несколько цифр, которые меньше предела их емкости (чтобы избежать ошибки округления). Хотя значения выглядят одинаково, они фактически не имеют одинакового значения.

Вы можете вычислить значение, а затем отобразить его с помощью круглой формат поездки:

value.ToString("r") 

Когда текстовое представление создано таким образом обрабатывается, он гарантированно генерировать тот же двойное значение, создавшего его. Вы можете поместить это в код, и это даст вам точное соответствие.

Однако, как правило, двойные значения не должны сравниваться для точного равенства, так как у вас редко бывает такая ситуация, когда вы хотите получить точное соответствие. Кроме того, тестирование для точного соответствия может быть не тем, что вы на самом деле хотите в этой ситуации, так как это зависит от того, что реализация остается точно такой же. Если бы вы использовали другой алгоритм, это дало бы разные ошибки округления, давая немного другой результат.