2009-11-23 13 views
13

Considérez:'sprintf': double précision en C

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

Output: s0.000000 

Dans l'extrait de code ci-dessus, la aa variable peut contenir seulement six décimales de précision. Je voudrais obtenir une sortie comme "s0.0000005". Comment puis-je y parvenir?

+2

FYI, 0.0000005l est un "long double", utilisez juste 0,0000005 pour une constante de type double. – progrmr

+0

Vous avez déjà répondu: http://stackoverflow.com/questions/69743/how-to-use-f-to-populate-a-double-value-into-a-string-with-the-right-precision – progrmr

Répondre

22

De votre question, il semble que vous utilisez C99, comme vous avez utilisé pour %lf double.

Pour atteindre le débit désiré remplacer:

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

avec

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

La syntaxe générale "%A.B" un moyen d'utiliser des chiffres après la virgule décimale B. La signification de A est plus compliquée, mais peut être lu sur here.

+9

'"% A.B "' ne signifie pas 'A' chiffres avant le point décimal. 'A' est la _" largeur du champ "_. C'est la largeur de caractère minimale du nombre entier imprimé. La sortie est complétée avec des espaces (par défaut) selon les besoins. – chux

+1

Je ne sais pas pourquoi cette réponse suggère de passer de 'lf' à' f'. 'lf' est un spécificateur de format parfaitement approprié pour' double'. En outre, il a été légalisé dans C99 spécifiquement pour corriger une incohérence agaçante entre les spécificateurs de format dans 'fscanf' et' fprintf'.Ce qui signifie que «lf» devrait être préféré à «f» pour les valeurs «doubles». 'f' est pour' float'. – AnT

5

Vous devez écrire comme sprintf(aa, "%9.7lf", a)

Découvrez http://en.wikipedia.org/wiki/Printf pour certains plus de détails sur les codes de format.

+2

% lf est pour longtemps double. % 9.7f devrait être utilisé pour un double. – progrmr

+2

@ kk6yb: '% lf' est indéfini pour C89, et identique à'% f' pour C99 (où les deux sont bons pour imprimer les valeurs 'double'). Pour un double long, le bon spécificateur de conversion est '% Lf'. – pmg

+1

Plus précisément, dans ''% X.Yf'', le' Y' représente le nombre de places après la virgule à afficher (la valeur par défaut est 6) et le 'X' représente le nombre minimum de caractères à afficher. Dans votre cas, le 'X' n'est pas nécessaire, mais vous devrez ajouter le '.Y' où' Y' est le nombre de décimales à imprimer. – bta

-1

Le problème est avec sprintf

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

% lf dit Interpet "un" comme un "long double" (16 octets), mais il est en fait un "double" (8 octets). Utilisez ceci:

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

Plus de détails here on cplusplus.com

+1

'% lf' est indéfini pour C89 et identique à'% f' pour C99. Pour un double long, le bon spécificateur de conversion est '% Lf'. – pmg

+0

Cela affichera 6 décimales - il est donc probable qu'il imprime 0,000000 au lieu de 0,000001. L'utilisation de "% 9.7f" est correcte pour 7 décimales. –

+0

Hmmm, oui, je n'ai pas fait attention aux décimales. Le point est que '% lf' attend un' double' en C99; '% Lf' s'attend à un' long double'. – pmg

Questions connexes