打印%g和%f之间的零填充差

printf zero padding difference between %g and %f

本文关键字:填充 之间 打印      更新时间:2023-10-16

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

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

输出
0.10
00.1

这在Windows上的vc++和Linux上的gcc中都是可重复的。

为什么会这样?这是一种正确的行为吗?

更新:我找到答案了,但我想我还是把问题留下吧…

正确。根据C99 7.19.6.1/8:

g样式的规范

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

当样式f没有指定删除尾零时

当使用%g时,printf选择在最小位置提供最佳精度的格式。您可以猜到它是如何计算精度的,知道对于d = 0.10500000,它打印"00.1",而对于d = 0.10500001,它打印"0.11"。

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

From doc at http://en.cppreference.com/w/cpp/io/basic_ostream精度管理浮点运算的十进制精度(std::ios_base的公共成员函数)宽度管理字段宽度(std::ios_base的public成员函数)