Учитывая заявления
float f = 7.1f;
double d = f;
Что мы можем утверждать в модульном тесте о d?
Например, это не работает:
Console.WriteLine(d == 7.1d); // false
Console.WriteLine(d < 7.1d + float.Epsilon); // true by luck
Console.WriteLine(d > 7.1d - float.Epsilon); // false (less luck)
Лучший способ, который я нашел до сих пор, - это преобразовать значение обратно:
float f2 = (float)d;
Console.WriteLine(f2 == f); // true
Что было бы так же, как грубый способ сказать
Console.WriteLine(d == 7.1f); // 7.1f implicitly converted to double as above
Этот вопрос НЕ касается двойной точности и точности с плавающей запятой в целом, но на самом деле ТОЛЬКО о прагматическом вопросе о том, как модульный тест может лучше всего описать пределы d. В моем случае d является результатом преобразования, которое происходит в коде, сгенерированном с помощью генерации облегченного кода. При тестировании этой генерации кода я должен делать утверждения о результате этой функции, и это, наконец, сводится к простому вопросу выше.
Assert.IsTrue(condition)
, вы могли бы использовать, например.Assert.AreEqual(value1, value2)
, который может обрабатывать эквивалентность между числовыми форматами. - person StuperUser   schedule 19.12.2012