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