【发布时间】:2012-12-19 12:46:13
【问题描述】:
鉴于陈述
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)可以处理数字格式之间的等价。 -
我仍然不确定您要在这里测试什么。 double 比 float 具有更高的精度,因此它们几乎不会彼此“相等”。
-
如果你省略了用于初始化浮点数的常量中的最后一个 f,情况可能会更糟,请在此处查看精心制作的示例stackoverflow.com/questions/13276862/…
标签: c# floating-point double numeric