在x86和x64上双重格式化不同

时间:2012-09-17 13:30:37

标签: c# .net number-formatting

鉴于以下测试:

[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

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

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

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

2 个答案:

答案 0 :(得分:2)

我认为秘诀在于使用“R”格式字符串(see more about this

“当使用此说明符格式化Single或Double值时,首先使用通用格式对其进行测试,对于Double,精度为15位,精度为7位精度。如果值成功解析为相同的数值,它使用通用格式说明符进行格式化。如果该值未成功解析回相同的数值,则使用精度的17位精度为Double,精确为9位精度。“< / p>

答案 1 :(得分:-1)

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

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