cit*_*kid 17 c# floating-point double numeric
鉴于这些陈述
float f = 7.1f;
double d = f;
Run Code Online (Sandbox Code Playgroud)
我们可以在单元测试中断言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)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的最好方法是将值转换回来:
float f2 = (float)d;
Console.WriteLine(f2 == f); // true
Run Code Online (Sandbox Code Playgroud)
这与粗野的说法相同
Console.WriteLine(d == 7.1f); // 7.1f implicitly converted to double as above
Run Code Online (Sandbox Code Playgroud)
这个问题一般不是关于double和float精度的,而是关于单元测试如何最好地描述d的限制的实用问题.在我的例子中,d是由轻量代码生成生成的代码中发生的转换的结果.在测试这个代码生成时,我必须对这个函数的结果做出断言,这最终归结为上面的简单问题.
您的“最佳方法”是断言您生成的代码返回的内容在float的误差范围内7.1。这可能是您想要检查的内容,在这种情况下,请继续。
另一方面,您可能想要断言生成的代码专门7.1f返回转换为 a的结果double,在这种情况下您可以执行以下操作:
Console.WriteLine(d == (double)f);
Run Code Online (Sandbox Code Playgroud)
这是更严格的 - 您的测试断言它d在一个小范围内,而上面的测试断言它d是一个特定值。
这实际上取决于您的用途d。如果不是精确值就会出现问题,请测试精确值,但如果在该值的范围内没问题float,请检查float.