鉴于陈述
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 是由轻量级代码生成生成的代码中发生的转换的结果。在测试这个代码生成时,我必须对这个函数的结果做出断言,这最终归结为上面的简单问题。