2009-12-07 22 views
8

Ho una matrice di float in cui i dati sono memorizzati con decimali diversi, quindi alcuni sono 123.40000, 123.45000, 123.45600 ... ora se voglio stampare questi valori nella stringa senza gli 0 in la fine in printf() in modo che siano 123.4, 123.45, 123.456, senza quegli 0 alla fine. È possibile? Se é cosi, come?Formattazione a virgola mobile in printf()

risposta

18

Utilizzare l'% g formattatore:

printf("%g", 123.4000); 

stampe

123,4

zeri finali vengono rimossi, ma purtroppo così è il punto decimale seguente, se la parte frazionaria è zero. Non so se v'è in realtà un modo di fare quello che vuoi direttamente utilizzando printf() - credo che qualcosa di simile è probabilmente la scelta migliore:

#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

Non è una cattiva idea di confrontare raddoppia? "Se (D-piano (d) == 0.0)" ? – himself

+1

@himself No, va bene quando sai cosa stai facendo. "Non confrontare mai i numeri in virgola mobile per" == "" è solo un'approssimazione per i non sofisticati. –

0

Uso% g -

Stampa un doppio in notazione normale o esponenziale, a seconda di quale sia più appropriato per la sua grandezza. 'g' usa lettere minuscole, 'G' usa lettere maiuscole. Questo tipo differisce leggermente dalla notazione a virgola fissa in cui non sono inclusi gli zeri insignificanti a destra del punto decimale. Inoltre, il punto decimale non è incluso nei numeri interi.

+0

solo una piccola query, cosa succede se voglio rimuovere gli zeri finali ma voglio mantenere il numero decimale in numeri interi, come 124.00000 è 123. – sfactor

3

Non so come hacky questo non è che:

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); 
} 

Returns 124.0.

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

Resi 124.123.

0

Stampa su un buffer (abbastanza grande). Stampa il buffer ... e se non c'è il '.' nel buffer stampa un punto.

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

modificare

La norma specifica la bandiera #:

# Il risultato viene convertito in un `` forma alternativa ''. [...] Per le conversioni a, A, e, E, f, F, g e G, il risultato della conversione di un numero a virgola mobile contiene sempre un carattere decimale, anche se nessuna cifra segue . [...] Per le conversioni g e G, gli zero finali non vengono rimossi dal risultato . [...]

... ma si ottiene l'zeri finali :(

Problemi correlati