2013-02-28 266 views
3

我想了解为什么零填充对于printf中的%g和%f格式有不同的作用。下面是一个示例程序: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 

这两个VC++在Windows重复性和GCC在Linux上。

它为什么这样工作?这是一个正确的行为?

更新:我找到了答案,但我想我会离开的问题开放...

+1

“我找到了答案,但我认为我会留下这个问题......”那么如果您为可能遇到同一问题的其他人分享了答案,那将会非常好。 – us2012 2013-02-28 14:02:34

+0

对,但我会稍后再做。我想给那些好奇的人留下一个机会来回答并获得接受。以防万一。 – queen3 2013-02-28 14:04:22

回答

3

(标准::的ios_base的公共成员函数) (标准::的ios_base的公共成员函数)这是对的。据的风格g在C99 7.19.6.1/8说明书:

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

而风格f未指定删除尾随零。

+0

右边,尾随的零被删除,因此现在有空间可以填充左边的零。 MSDN也说“拖尾的零被截断”。 – queen3 2013-02-28 14:16:52

1

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