为什么使用“G”标准格式字符串格式化Double不会返回完整字符串?

时间:2014-12-01 19:27:15

标签: c# string-formatting significant-digits

我希望我对此研究得足够多,以至于我的前提并非完全偏离基础。如果是这样,那么那里的数学家可以让我直截了当。

我的前提是,Double12.5值应该舍入为5 有效数字(非小数位)12.500。相反,使用以下C#代码,我得到12.5

Double d = 12.5;
Console.WriteLine(d.ToString("G5"));

我从2007年开始this post,这似乎与我的问题相呼应。事实上,我使用这些示例数字只是为了保持一致。

我的目标是更好地理解以下内容:

  
      
  • 我对sig figs的理解在数学上是否正确?即,我的期望是合理的,还是输出“12.5”在某种程度上是正确的?

  •   
  • 这真的是一个(非常长寿的)框架中的错误吗?如果是,可以/将会修复吗?

  •   
  • 假设这是一个错误,我现在可以做些什么呢?写一个hack来确定有多少   sig figs你实际上回来了然后填充它?滚动我自己的代码   做“G”格式字符串应该做什么?我已经在SO上遇到过这样的例子,所以也许证明不存在干净的选择。

  •   

此外,我确实意识到Double的存储问题可能会对此问题的舍入方面产生负面影响,但就目前而言,我只关注更多sig figs而非原始数字的问题。

编辑:我已经对框架4.5进行了测试。

2 个答案:

答案 0 :(得分:6)

G-Format Specifier上查看此链接。它明确指出:

  

如果需要,结果包含小数点,省略小数点后的尾随零。

答案 1 :(得分:0)

Double值四舍五入为15位有效数字,而非五位。

参考:The General ("G") format specifier

将数字四舍五入为任意数量的有效数字并不意味着格式化字符串必须包含该数字位数。如果该值四舍五入为12.5000000000000,那么它将被格式化为"12.5",因为这是表示该值的最紧凑方式。