为什么printf(“%。6g,<value>)在小数点后忽略零?</value>

时间:2012-05-20 07:30:05

标签: c floating-point double printf precision

我想在小数点后打印最多6位数,所以我使用了以下内容:

printf("%.6g",0.127943989);

printf的输出是0.127944这是正确的,但是当我尝试这个时:

printf("%.6g",0.007943989);

输出变为0.00794399,这不是我期望看到的!

似乎printf在小数点后忽略零。那么如何强制它输出最大6位精度?

2 个答案:

答案 0 :(得分:5)

"%f"格式说明符:

printf("%.6f\n",0.007943989)  // prints 0.007944
你正在寻找什么?请注意,如果数字保证,这不会自动切换为%e格式样式,因此这可能不是您正在寻找的。

例如,以下内容:

printf("%.6g\n",0.00007943989);
printf("%.6f\n",0.00007943989);

打印:

7.94399e-005
0.000079

并且不清楚是否需要"%g"提供的较小数字的指数形式。

请注意,%f%g的规范在处理精度规范方面的行为略有不同。

  • for %f:“小数点字符后的位数等于精度规格”
  • 表示%g:“精度指定有效位数”

并且小数点后的零运行不计入有效数字(这表示您在%g看到的行为)。

答案 1 :(得分:1)

ISO C标准要求

  

可选的精度,以句点('。')的形式后跟   一个可选的十进制数字字符串......这给出了...最大值    g G 转化

的有效数字位数

以下是使用GNU libc获得的输出(GCC 4.5.1,libc 2.11; GCC 4.6.3,libc 2.15)

printf("%.6g\n", 0.12);
0.12
printf("%.6g\n", 0.1234567890);
0.123457
printf("%.6g\n", 0.001234567890);
0.00123457
printf("%#.6g\n", 0.001234567890);
0.00123457
printf("%.6g\n", 0.00001234567890);
1.23457e-05
printf("%#.6g\n", 0.00001234567890);
1.23457e-05

printf("%.6f\n", 0.12);
0.120000
printf("%.6f\n", 0.1234567890);
0.123457
printf("%.6f\n", 0.001234567890);
0.001235
printf("%#.6f\n", 0.001234567890);
0.001235
printf("%.6f\n", 0.001234567890);
0.000012
printf("%#.6f\n", 0.001234567890);
0.000012