c# - x86 和 x64 上的双重格式不同

标签 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 值都以这种方式表现。

我了解 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/

相关文章:

c# - 无法在客户端机器上运行 Crystal 报表

c# - 无法从桌面控制台应用程序访问 Azure Key Vault

c# - 使用 JQuery Validate() 问题验证 .NET 2.0 表单

java - 如何在 GUI 中设置货币格式?

python 逗号将值分隔成千位,不带尾随零

c# - Entity Framework 中的 SaveChanges 与 AcceptAllChanges

c# - C 无符号 `char ** out` 到 C# `byte[]`

.net - 重用 IBM.WMQ.MQQueue 对象

c# - ASP.NET 身份验证 cookie

python - 如何使用 pandastable 在表格中设置数字格式