3

目前,我正在处理复杂计算中的高精度数字。一些结果和源数据应该以序列化的形式存储。一切都很好,直到我得到神奇的双倍值:0.00000060912702792848

将该值写入字符串(XmlWriter 所做的):

s = d.ToString("R", NumberFormatInfo.InvariantInfo);

给出预期结果6.0912702792848E-07

但是,当我尝试取回双倍值时,魔法就开始了(XmlReader 的工作方式):

d=double.Parse(s, NumberStyles.Float,  NumberFormatInfo.InvariantInfo);

转换后的值为 0.00000060912702792848005,末尾有005 个额外数字。

它看起来像是给出这种结果的特殊数字组合。我想念什么?

环境:Windows 7 Professional,64 位。

4

2 回答 2

0

往返 (R) 格式说明符的 MSDN 文档包含以下注释:

在某些情况下,如果使用 /platform:x64 或 /platform:anycpu 开关编译并在 64 位系统上运行,使用“R”标准数字格式字符串格式化的 Double 值不会成功往返。要变通解决此问题,您可以通过使用“G17”标准数字格式字符串来格式化 Double 值。下面的示例使用带有 Double 值的“R”格式字符串无法成功往返,并且还使用“G17”格式字符串成功往返原始值。(标准数字格式字符串

将平台设置为 AnyCpuprefer 32 bit并在项目设置中禁用标志时,我可以重现您的问题。启用prefer 32 bit标志时,解析的双精度匹配原始的序列化值。正如文档所述,您可以使用 G17 格式字符串来接收预期值。

于 2015-04-14T07:41:16.173 回答
0

虽然不完全是您问题的答案,但如果您想在最后去掉多余的小数,您可以使用:

s = d.ToString("G20", NumberFormatInfo.InvariantInfo);
于 2013-02-13T11:14:36.397 回答