2009-12-07 89 views
8

我有一個浮點數組,其中數據存儲在不同的小數點,所以有些是123.40000123.45000123.45600 ...現在如果我想打印這些值在字符串中沒有0在printf()結束,因此它們是123.4,123.45,123.456,最後沒有那些0。這可能嗎?如果是這樣,怎麼樣?在printf()中的浮點格式化

回答

18

使用%克格式化:

printf("%g", 123.4000); 

打印

123.4

尾隨零被除去,但不幸的是這樣是後小數點如果小數部分是零。我不知道是否真正有做你想要直接使用的是什麼的printf()的任何方式 - 我覺得這樣的事情可能是你最好的選擇:

#include <stdio.h> 
#include <math.h> 

void print(FILE * f, double d) { 
    if (d - floor(d) == 0.0) { 
     fprintf(f, "%g.", d); 
    } 
    else { 
     fprintf(f, "%g", d); 
    } 
} 

int main() { 
    print(stdout, 12.0); 
    print(stdout, 12.300); 
} 
+1

是不是一個壞主意,比較雙打? 「如果(d-地板(d)== 0.0)」 ? – himself 2013-01-15 07:14:29

+1

@himself不,當你知道你在做什麼時很好。「絕不比較'=='的浮點數字」僅僅是一個簡單的近似值。 – 2014-06-16 19:23:47

0

使用%G -

打印無論是正態還是指數形式的雙重數據,無論哪一種更適合其數量級。 'g'使用小寫字母,'G'使用大寫字母。該類型與定點符號略有不同,因爲不包括小數點右側不顯着的零。另外,小數點不包含在整數中。

+0

只是一個小的查詢,如果我想刪除尾部零但想保留整數的小數點,如124.00000是123,該怎麼辦? – sfactor 2009-12-07 23:45:33

3

我不知道如何哈克這不過是:

http://codepad.org/e3Q3pUNd

float f = 124.000; 
if (f == (int) f) { 
    printf("%.1f\n", f); /* .1 can be changed */ 
} else { 
    printf("%g\n", f); 
} 

返回124.0

float f = 124.123000; 
if (f == (int) f) { 
    printf("%.1f\n", f); /* .1 can be changed */ 
} else { 
    printf("%g\n", f); 
} 

返回124.123

0

打印到(足夠大)緩衝區。打印緩衝區......如果緩衝區中沒有'.',則打印一個點。

char buf[100]; 
sprintf(buf, "%g", val); 
printf("%s", buf); 
if (strchr(buf, '.') == NULL) putchar('.'); 

編輯

該標準規定了#標誌:

#結果被轉換爲``替代形式 ''。 [...]對於a, e,E,f,F,g和G轉換,轉換浮點數 的結果始終包含一個小數點字符,即使沒有數字後面跟着 。 [...]對於g和G轉換,結果不會從 中刪除尾部零。 [...]

...但你的尾隨零:(