2009-11-23 18 views
13

Considere:'sprintf': doble precisión en C

double a = 0.0000005l; 
char aa[50]; 
sprintf(aa, "%lf", a); 
printf("%s", aa); 

Output: s0.000000 

En el código anterior, la variable aa puede contener sólo seis precisión decimal. Me gustaría obtener un resultado como "s0.0000005". ¿Cómo logro esto?

+2

FYI, 0.0000005l es un "doble largo", use solo 0.0000005 para una constante de tipo doble. – progrmr

+0

Ya ha respondido: http://stackoverflow.com/questions/69743/how-to-use-f-to-populate-a-double-value-into-a-string-with-the-right-precision – progrmr

Respuesta

22

de su pregunta que parece que está utilizando C99, como usted ha utilizado para %lf doble.

Para conseguir la salida deseada reemplazar:

sprintf(aa, "%lf", a); 

con

sprintf(aa, "%0.7f", a); 

La sintaxis general "%A.B" significa utilizar dígitos B después del punto decimal. El significado de A es más complicado, pero se puede leer acerca de here.

+9

'"% A.B "' _no quiere decir_ significa 'A' dígitos antes del punto decimal. 'A' es el _" ancho de campo "_. Es el ancho mínimo de caracteres de todo el número impreso. La salida se rellena con espacios (por defecto) según sea necesario. – chux

+1

No estoy seguro de por qué esta respuesta sugiere cambiar de 'lf' a' f'. 'lf' es un especificador de formato perfectamente apropiado para' double'. Además, se legalizó específicamente en C99 para solucionarlo, más que una inconsistencia molesta entre los especificadores de formato en 'fscanf' y' fprintf'.Lo que significa que 'lf' debe ser * preferred * sobre' f' para los valores 'double'. 'f' es para' flotar'. – AnT

5

tiene que escribir como si fuera sprintf(aa, "%9.7lf", a)

Salida http://en.wikipedia.org/wiki/Printf para algunos más detalles sobre los códigos de formato.

+2

% lf es por mucho tiempo doble. % 9.7f se debe usar para un doble. – progrmr

+2

@ kk6yb: '% lf' no está definido para C89, y lo mismo que'% f' para C99 (donde ambos son buenos para imprimir valores 'dobles'). Para un doble largo, el especificador de conversión correcto es '% Lf'. – pmg

+1

Más precisamente, en ''% X.Yf'' la' Y' representa el número de lugares después del decimal para mostrar (el valor predeterminado es 6) y la 'X' representa el número mínimo de caracteres para mostrar. En su caso, la 'X' no es necesaria, pero necesitará agregar' .Y' donde 'Y' es la cantidad de decimales que se imprimirán. – bta

-1

el problema es con sprintf

sprintf(aa,"%lf",a); 

% LF dice a interpet "a" como "largos" dobles (16 bytes), pero en realidad es un "doble" (8 bytes). Use este lugar:

sprintf(aa, "%f", a); 

Más detalles here on cplusplus.com

+1

'% lf' no está definido para C89, y lo mismo que'% f' para C99. Para un doble largo, el especificador de conversión correcto es '% Lf'. – pmg

+0

Eso imprimirá 6 decimales, por lo que es muy probable que imprima 0.000000 en lugar de 0.000001. Usar "% 9.7f" es correcto para 7 lugares decimales. –

+0

Hmmm, sí, no presté atención a los decimales. El punto es que '% lf' espera un' doble' en C99; '% Lf' espera un' long double'. – pmg

Cuestiones relacionadas