C#magic double value parse

时间:2013-02-13 10:33:24

标签: double xmlserializer

目前我正在处理复杂计算中具有高精度的数字。 一些结果和源数据应以序列化形式存储。 一切都很好,直到我获得魔法双倍值: 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位。

2 个答案:

答案 0 :(得分:0)

虽然不完全是你问题的答案,如果你想在最后摆脱额外的小数,你可以使用:

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

答案 1 :(得分:0)

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

  

在某些情况下,使用" R"格式化的Double值。标准数字   如果使用编译,则格式字符串不能成功往返   / platform:x64或/ platform:anycpu在64位系统上切换并运行。   若要解决此问题,您可以使用。格式化Double值   " G17"标准数字格式字符串。以下示例使用   " R"格式字符串,其Double值不会往返   成功,并使用" G17"格式化字符串成功   往返原始值。   (Standard Numeric Format Strings

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