2011-07-07 17 views
6

me encontré con algo de código con una línea parecida a:¿Cuál es el punto de un ancho más pequeño que una precisión en printf()?

fprintf(fd, "%4.8f", ptr->myFlt); 

No trabajar con C++ mucho en estos días, leí el documento en printf y su calaña, y aprendí que en este caso 4 es el "ancho" y 8 es la "precisión". El ancho se definió como mínimo cantidad de espacios ocupados por la salida, relleno con espacios en blanco iniciales si es necesario.

Siendo ese el caso, no puedo entender cuál sería el punto de una plantilla como "% 4.8f", ya que los 8 decimales (cero acolchado si es necesario) después del punto ya aseguran que el ancho de 4 fue cumplido y excedido. Por lo tanto, he escrito un pequeño programa, en Visual C++:

// Formatting width test 

#include "stdafx.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    printf("Need width when decimals are smaller: >%4.1f<\n", 3.4567); 
    printf("Seems unnecessary when decimals are greater: >%4.8f<\n", 3.4567); 
    printf("Doesn't matter if argument has no decimal places: >%4.8f<\n", (float)3); 

    return 0; 
} 

que da el siguiente resultado:

Need width when decimals are smaller: > 3.5< 
Seems unnecessary when decimals are greater: >3.45670000< 
Doesn't matter if argument has no decimal places: >3.00000000< 

En el primer caso, la precisión es menor que el ancho especificado, y de hecho, un líder se agrega espacio Sin embargo, cuando la precisión es mayor, el ancho parece redundante.

¿Hay alguna razón para un formato de esa manera?

+2

No, no hay ninguna razón. Si necesito algo así, uso '% 0.8f' para que sea obvio que no me importa cuántos dígitos están a la izquierda del punto decimal. –

+1

Apuesto a que el programador original pretendía que el formato especificara la salida formateada de la siguiente manera: '1234.87654321'. Si estuviera inventando 'printf()' así es como podría haberlo hecho (y crear algunos otros caracteres para manejar el ancho y la precisión generales para formatos de punto no flotante). –

+0

¿Por qué etiqueta esto 'C++' en lugar de 'c'? – leftaroundabout

Respuesta

3

El especificador de formato ancho solamente afecta a la salida si la anchura total del número impreso es menor que la anchura especificada. Obviamente, esto nunca puede suceder cuando la precisión se establece mayor o igual que el ancho. Entonces, la especificación de ancho es inútil en este caso.

Here's un artículo de MSDN; la última oración lo explica.

Un ancho de campo inexistente o pequeño no causa el truncamiento de un campo; si el resultado de una conversión es más ancho que el ancho del campo, el campo se expande para contener el resultado de la conversión.

0

Probablemente solo sea una suposición, pero: La precisión otorga a los decimales una longitud que no se excederá si obtiene más decimales. Del mismo modo, el ancho evita que su número consuma menos espacio del que debería. Si piensa en algún tipo de tabla con números, solo puede lograr columnas uniformes cuando cada columna en cada fila tenga el mismo ancho, independientemente del número que contenga.

Así que sería necesaria precisión en algún precio como formato como 10,00 € en el que siempre quiere 2 decimales.

Para su línea específica: me siento como usted acerca de la redundancia del especificador de ancho en este caso especial.

+0

Pero el ancho de 4 se aplica a la salida general (antes y después del punto decimal). Esa salida no puede ser más estrecha que 10, contando el punto decimal y un número que lo precede. Debido a la precisión de 8, incluso 0 será "0.00000000". – Buggieboy

+0

Como ya dije, no parece tener ningún efecto en este caso. Tal vez el formato fue cambiado a menudo ... – Nobody

2

Tal vez un error del programador? Tal vez intercambiaron %8.4f o que en realidad pretenden %12.8f o incluso %012.8f

See codepad sample:

#include <stdio.h> 

int main() 
{ 
    printf("Seems unnecessary when decimals are greater: >%4.8f<\n", 3.4567); 
    printf("Seems unnecessary when decimals are greater: >%8.4f<\n", 3.4567); 
    printf("Seems unnecessary when decimals are greater: >%12.4f<\n", 3.4567); 
    printf("Seems unnecessary when decimals are greater: >%012.4f<\n", 3.4567); 

    return 0; 
} 

salida

Seems unnecessary when decimals are greater: >3.45670000< 
Seems unnecessary when decimals are greater: > 3.4567< 
Seems unnecessary when decimals are greater: >  3.4567< 
Seems unnecessary when decimals are greater: >0000003.4567< 
Cuestiones relacionadas