printf零填充差异在%g和%f之间

时间:2013-02-28 13:40:17

标签: c++ printf

我想了解为什么零填充对printf中的%g和%f格式的工作方式不同。这是一个示例程序:

#include <stdio.h>
int main()
{
  double d = 0.10000000000001;
  printf("%04.2f\n", d);
  printf("%04.2g\n", d);
  return 0;
}

输出

0.10
00.1

这在Windows上的VC ++和Linux上的gcc中都是可重现的。

为什么它会像这样?这是正确的行为吗?

更新:我找到了答案,但我想我会把问题打开......

3 个答案:

答案 0 :(得分:3)

这是对的。根据C99 7.19.6.1/8中的样式g的规范:

  

除非使用#标志,否则从结果的小数部分删除任何尾随零,如果没有剩余小数部分,则删除小数点字符

虽然样式f未指定删除尾随零。

答案 1 :(得分:1)

使用%g时,printf会选择在最小位置提供最佳精度的格式。您可以猜测它是如何评估精度的,因为对于d = 0.10500000,它打印“00.1”,而对于d = 0.10500001,它打印“0.11”。

答案 2 :(得分:0)

您可以通过std :: cout对象上的同名成员函数来控制宽度和精度。

来自http://en.cppreference.com/w/cpp/io/basic_ostream的文档  精确     管理浮点运算的小数精度 (std :: ios_base的公共成员函数) 宽度     管理字段宽度 (std :: ios_base的公共成员函数)