2009-12-07 25 views
8

Tengo una matriz de flotantes donde los datos se almacenan con puntos decimales variables, algunos son 123.40000, 123.45000, 123.45600 ... ahora si quiero imprimir estos valores en la cadena sin los 0 en el final en printf() para que sean 123.4, 123.45, 123.456, sin esos 0 al final. es posible? ¿Si es así, cómo?Formato de punto flotante en printf()

Respuesta

18

Utilice el% g formateador:

printf("%g", 123.4000); 

grabados

123,4

ceros finales se eliminan, pero por desgracia lo es el punto decimal de salida si la parte fraccionaria es cero. No sé si en realidad hay alguna manera de hacer lo que desee directamente usando printf() - Creo que algo como esto es probablemente su mejor apuesta:

#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

no es una mala idea comparar los dobles? "Si (d-piso (d) == 0.0)" ? – himself

+1

@himself No, está bien cuando sabes lo que estás haciendo. "Nunca compares los números de punto flotante para' == '" es solo una aproximación para los menos sofisticados. –

0

Uso% g -

Imprimir un doble en notación normal o exponencial, cualquiera que sea más apropiado para su magnitud. 'g' usa letras minúsculas, 'G' usa letras mayúsculas. Este tipo difiere ligeramente de la notación de punto fijo en que los ceros insignificantes a la derecha del punto decimal no están incluidos. Además, el punto decimal no está incluido en números enteros.

+0

solo una pequeña consulta, ¿qué ocurre si quiero eliminar los ceros finales pero quiero mantener el decimal en números enteros, como 124.00000 es 123? – sfactor

3

No sé cómo hacky esto no es sino:

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

devoluciones 124.0.

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

Devoluciones 124.123.

0

Imprima en un búfer (lo suficientemente grande). Imprima el búfer ... y si no hay '.' en el búfer, imprima un punto.

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

edición

La norma especifica la bandera #:

# El resultado se convierte en una `` forma alternativa ''. [...] Para las conversiones a, A, e, E, f, F, gy G, el resultado de convertir un número de coma flotante siempre contiene un carácter de punto decimal, incluso si no hay dígitos después de . [...] Para las conversiones g y G, los ceros finales no se eliminan del resultado . [...]

... pero te dan los ceros a la derecha :(

Cuestiones relacionadas