Pregunta

Tengo una serie de flotadores donde se almacenan los datos con distintos puntos decimales por lo que algunos son 123.40000, 123.45000, 123.45600 ... ahora si quiero imprimir estos valores en la cadena sin los 0s en el extremo de printf() para que se son 123.4, 123.45, 123.456, sin esas 0s en el extremo. es posible? Si es así, ¿cómo?

¿Fue útil?

Solución

Utilice el% g formateador:

printf( "%g", 123.4000 );

impresiones

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

Otros consejos

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

Las devoluciones 124.0.

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

Las devoluciones 124.123.

Use% g -

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

Imprimir en una memoria intermedia (lo suficientemente grande). Imprimir la memoria ... y si el que no hay '.' en el buffer de imprimir un punto.

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

editar

El estándar especifica la bandera #:

  

# El resultado se convierte en una `` forma alternativa ''. [...] Para una, A,   e, E, F, F, G, y las conversiones g, el resultado de la conversión de un punto flotante   Número siempre contiene un carácter de punto decimal, aunque no hay cifras siguen   eso. [...] para G y G conversiones, ceros a la derecha no se eliminan de   el resultado. [...]

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top