2009-12-07 12 views
8

Je dispose d'un tableau de flottants où les données sont stockées avec des points décimaux variables. Certaines sont 123.40000, 123.45000, 123.45600 ... maintenant si je veux imprimer ces valeurs dans la chaîne sans les 0 dans la fin en printf() de sorte qu'ils sont 123.4, 123.45, 123.456, sans les 0 à la fin. Est-ce possible? Si c'est le cas, comment?Formatage à virgule flottante dans printf()

Répondre

18

Utilisez le formatter% g:

printf("%g", 123.4000); 

impressions

123,4

zéros en fin de chaîne sont supprimés, mais malheureusement, est donc le point décimal de fuite si la partie décimale est égale à zéro. Je ne sais pas s'il est en fait une façon de faire ce que vous voulez directement à l'aide printf() - Je pense que quelque chose comme ceci est probablement votre meilleur pari:

#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

est-il pas une mauvaise idée de comparer double? "Si (d étage (d) == 0.0)" ? – himself

+1

@ himself Non, c'est bien quand vous savez ce que vous faites. "Ne jamais comparer les nombres à virgule flottante pour' == '" est juste une approximation pour les non-sophistiqués. –

0

Utilisez% g -

Imprimer un double en notation normale ou exponentielle, selon ce qui convient le mieux à sa magnitude. «g» utilise des lettres minuscules, «G» utilise des lettres majuscules. Ce type diffère légèrement de la notation à virgule fixe en ce que les zéros non significatifs à la droite de la virgule décimale ne sont pas inclus. De plus, le point décimal n'est pas inclus dans les nombres entiers.

+0

juste une petite requête, et si je veux supprimer les zéros de fin, mais que je veux garder la décimale en nombres entiers, comme 124.00000 est 123. – sfactor

3

Je ne sais pas comment ce aki est mais:

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

Retours 124.0.

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

Renvoie 124.123.

0

Imprimez dans un tampon (assez grand). Imprimer le tampon ... et s'il n'y a pas '.' dans le tampon imprimer un point.

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

modifier

La norme spécifie le drapeau #:

# Le résultat est converti en un `` forme alternative ''. [...] Pour a, A, e, les conversions E, f, F, g et G, le résultat de la conversion d'un nombre à virgule flottante contient toujours un caractère décimal, même si aucun chiffre ne suit . [...] Pour les conversions g et G, les zéros de fin ne sont pas supprimés du résultat . [...]

... mais vous obtenez les zéros :(