Bonjour,
J'aimerais pouvoir afficher des nombres de type double avec 3 chiffres apres la virgules si il y en a autant, mais aucun si il n'y en a pas.
Y a t'il a flag dans printf qui gere ca ?
Merci d'avance
Bonjour,
J'aimerais pouvoir afficher des nombres de type double avec 3 chiffres apres la virgules si il y en a autant, mais aucun si il n'y en a pas.
Y a t'il a flag dans printf qui gere ca ?
Merci d'avance
Hello,
Oui et non.Envoyé par Toutankharton
Il y a ce que l'on appelle la précision pour les spécificateurs de format des nombres flottants :
Maintenant, et c'est plus délicat, comment savoir qu'il n'y a pas de partie fractionnelle ou 3 décimales et rien après ? D'après la représentation des nombres flottants, c'est difficile à dire. Une solution bête peut être de faire un affichage plus ou moins complet (différent de la valeur réelle) du nombre flottant dans un tampon temporaire et de compter à rebours tant que l'on rencontre '0'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 double gg = 5.64; printf("%.3f\n", gg);
MAIS ATTENTION, il faut choisir une précision raisonnable pour l'affichage "complet", car la précision des flottants fait que 5.687 n'est par exemple pas 5.867, hé oui. Voir l'affichage complet en switchant de sprintf() dans le code ci dessous, qui affiche toutes les décimales du flottant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 #include <math.h> #include <float.h> #include <stdio.h> #define STR_(x) #x #define STR(x) STR_(x) int main(void) { int nbDig; char buffer[50] = {'\0'}, fmt[50] = {'\0'}, *p = NULL, *q = NULL; double gg = 5.687; double int_part, frac_part; frac_part = modf(gg, &int_part); /* Permet de voir que 5.687 n'est pas vraiment 5.687 */ /* sprintf(buffer, "%." STR(DECIMAL_DIG) "f", frac_part); */ /* on prend 8 digits de précision */ sprintf(buffer, "%.8f", frac_part); puts(buffer); p = buffer + strlen(buffer) - 1; q = p; while(*p == '0') { --q; --p; } while(*p != '.') { --p; } nbDig = q-p; printf("%d\n", nbDig); sprintf(fmt, "%%.%df", nbDig); printf(fmt, gg); return 0; }
Partager