我对IEEE 754有一个相当不错的理解,所以这不是“为什么添加数字a和数字b导致......” - 问题的类型。
相反,我想问一下我是否正确理解了定点数字格式说明符,因为它的行为与我对某些双值的预期不同。
例如:
double d = 0x3FffffFFFFfffe * (1.0 / 0x3FffffFFFFffff);
Console.WriteLine(d.ToString("R"));
Console.WriteLine(d.ToString("G20"));
Console.WriteLine(d.ToString("F20"));
"R"
和"G"
说明符都打印出相同的内容 - 正确值:0.99999999999999989
但"F"
说明符总是向上舍入为1.0
无论我告诉它包含多少小数。即使我告诉它打印99个小数的最大数量("F99"
),它仍然只输出“1”。 - 后跟99个零。
我的理解是否已被破坏,有人可以指向我的规范中的相关部分,还是这种行为被打破了? (这对我来说不是一个破坏者,我只是想知道。)
Here就是我所看到的,但我没有看到解释这一点。
(这是.Net4.0)
答案 0 :(得分:0)
用户“w.b”链接到另一个问题,我怀疑这个问题有最好的答案可用...尽管在细节和文档方面存在一些模糊性。 (不幸的是评论被删除了。)
关联的问题是Formatting doubles for output in C#。
简而言之,它似乎表明除非您使用G
或R
说明符,否则在自定义格式化之前输出总是减少到15位小数。任何人都可以链接到该问题的最佳文档是this MSDN page。细节和措辞并不像我希望的那样清晰,但如上所述,我认为这是我将要找到的最好的。