2

给定以下测试:

[Fact]
public void FactMethodName()
{
    var d = 6.4133;
    var actual = d.ToString("R");
    Assert.Equal("6.4133", actual);
}

它在 x86 上传递,但不在任何 CPU 或 x64 上:

Assert.Equal() Failure
Position: First difference is at position 5
Expected: 6.4133
Actual:   6.4132999999999996

问题是为什么会这样?请注意,并非所有双精度值都以这种方式运行。

我了解浮点问题。无需将我指向维基百科。无需指出测试是不正确的——它只是说明了问题——Console.WriteLine(..);如果你愿意,可以将其更改为。

更新我删除了对测试运行者的提及,因为这些细节被证明是无关紧要的。

4

2 回答 2

2

我认为秘诀在于使用“R”格式字符串(查看更多信息

"When a Single or Double value is formatted using this specifier, it is first tested using the general format, with 15 digits of precision for a Double and 7 digits of precision for a Single. If the value is successfully parsed back to the same numeric value, it is formatted using the general format specifier. If the value is not successfully parsed back to the same numeric value, it is formatted using 17 digits of precision for a Double and 9 digits of precision for a Single."

于 2012-09-18T16:23:50.400 回答
-1

正如 Raj 和 ja72 指出的那样,问题在于数字舍入,我意识到您的测试只是问题的一个说明,但在现实世界的测试中,您应该避免这些逻辑错误。特别要避免强制转换为字符串或调用任何其他可能会影响测试成功的副作用的方法。

不幸的是,这通常被称为脆弱测试。它有时适用于某些机器。如果您在一个开发团队中工作(尤其是具有构建服务器或离岸或近岸团队的团队),那么这样的测试可能值得获得 Works on my machine 奖

于 2012-09-17T14:03:54.087 回答