给出以下测试:
[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 值都以这种方式表现。
我了解 float 问题。无需将我指向维基百科。无需指出测试不正确——它只是说明了问题——如果你愿意,可以将其更改为 Console.WriteLine(..);
。
更新 我删除了对测试运行器的提及,因为这些细节被证明是无关紧要的。
最佳答案
我认为秘诀在于使用“R”格式字符串(see more about this)
“当使用此说明符格式化 Single 或 Double 值时,首先使用通用格式对其进行测试,Double 的精度为 15 位,Single 的精度为 7 位。如果该值成功解析回相同的数值,则使用通用格式说明符对其进行格式化。如果该值未成功解析回相同的数值,则使用 Double 的 17 位精度和 Single 的 9 位精度进行格式化。"
关于c# - x86 和 x64 上的双重格式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460310/