3

我想了解为什么零填充对于 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 中都可以重现。

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

更新:我找到了答案,但我想我会留下这个问题......

4

3 回答 3

3

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

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

而样式f没有指定删除尾随零。

于 2013-02-28T14:13:11.203 回答
1

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

于 2013-02-28T14:13:51.620 回答
0

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

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

于 2013-02-28T13:44:12.803 回答