往返格式说明符的 64 位与 32 位双解析问题"R"



我在 .net (4.6.1( 中有一个场景,其中解析 6dp 浮点值的字符串表示形式在 32 位和 64 位模式下产生不同的结果。

[Fact]
public void ParseTest()
{
var numText = "51.580133";
double.Parse(numText)
.ToString("R")
.Should().Be(numText);
}

此测试在 32 位模式下通过,但在 64 位模式下失败,因为生成的文本为:"51.580132999999996">

我希望用无理数或通过方程得出的数字来舍入这样的问题,但这里浮点的长度和准确性没有歧义。

这是在较旧的系统中,因此将所有内容更改为十进制需要付出很大的努力。

问题:

  1. 为什么会这样?
  2. 有哪些选项可以可靠地将此值舍入/截断为 6dp?

更新 这有效,并生成与 ToString("G6"( 不同的输出:

[Fact]
public void ParseText()
{
var numText = "51.580133";
double.Parse(numText)
.ToString("G8")
.Should().Be(numText);
}

我从Microsoft中找到了这个有趣的观点,这可能解释了这个问题

在某些情况下,使用"R"标准数字格式化的双精度值 格式字符串在使用/platform:x64 或/platform:anycpu 切换并在 64 位系统上运行。

要变通解决此问题,您可以使用 "G17"标准数字格式字符串。以下示例使用 "R"格式字符串,具有不往返的双精度值 成功,并且还使用"G17"格式字符串成功 往返原始值。

注释和示例可以在这里找到:https://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110(.aspx

最新更新