2013-02-28 262 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」。