Bonjour,
Est-il possible de limiter le nombre de décimals d'un float lors d'un scanf ou d'un atof ?
J'ai essayer avec "%.2f" comme en affichage mais ça ne marche pas : /
Ou bien peut-on faire ça directement à la création de la variable ?
Merci
Version imprimable
Bonjour,
Est-il possible de limiter le nombre de décimals d'un float lors d'un scanf ou d'un atof ?
J'ai essayer avec "%.2f" comme en affichage mais ça ne marche pas : /
Ou bien peut-on faire ça directement à la création de la variable ?
Merci
Et bien non. :cry:
Pas avec les fonctions standard d'accès aux flux d'entrée/sortie (stdio.h).
Tout ce que tu peux faire, c'est permettre à un utilisateur d'entrer une chaîne de caractères (gets est ce qu'il y a de mieux pour faire ça) et ensuite (lorqu'il a appuyé sur ENTRÉE) vérifier si cette chaîne répond à tes attentes.
Si tu tiens vraiment à faire ce que tu dis, il faut prendre la main à chaque caractère saisi ce qui se fait de manière non standard avec les fonctions de gestion de la console (conio.h sous windoz).
ah ....
tant pis, je vais essayer de contourner le problème ne multipiant par 1000 et en castant en int alors : /
Merci de l'info
Tu peux très bien contourner le probleme (tout du moins pour le scanf)
en utilisant un tableau de char ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 float valeur; char decim[1]; //je ne suis pas certain du codage du scanf :s scanf("%d.%c%c",&valeur,&decim[0],&decim[1]); //passe les décimal de caractere en valeur (pour ASCII only) //fonction atoi(); si tu veux plus de portabilite //dixaine decim[0]-=0x30; decim*=10; //unite decim[1]-=0x30; //ajoute les décimal a ton float valeur*=100; valeur=valeur+decim[0]+decim[1]; valeur= valeur/100;
ah, je vois ce que tu veux faire ...
que signifie 0x30 stp ?
sinon quitte à bidouiller, j'ai préférer multiplier par 1000 et caster en int
merci pour l'idée
tu peux toujours le faire... :D
Qu'est-ce qu'un float :
une partie entière et une partie décimale..
Il suffit que tu déclares 2 entiers. Et que tu saisisses par bouts ta chaîne... Avec des chaînes adaptées...
Tu veux un xxxxxxx.yy ?
Tu déclares une chaîne de 8 (pour xxxxxxx) et une chaîne de 3 (pour yy).
C'est pas pratique, mais ça se fait :P
Sinon tu boucles ou tu tronques....
Et bien en ASCII (je ne sais pas pour les autres) les caractères :
0,1,2,3 à 9 sont codés de la façon suivante
0x30
0x31
0x32...
...
0x39
(sous la représentation hexadécimale)
Donc quand tu va taper un caractère au clavier (compris entre 0 et 9) choper grace au scanf alors tu va retrouver dans ton char quelque chose du style
0x31 (si t'as tapé "1").
Mais toi ce qui t'interesse c'est l'ENTIER qui ce cache derière ce caractère donc tu enlève 0x30 pour avoir 1.
Quelle horreur ..
Quel besoin de coder en hexa pour faire du calcul décimal ????
On vous met n'importe quoi dans la tête...
Parceque c'est plus facile de voir une relation entre :
0x30 et 0
0x31 et 1
etc...
que
48 et 0
49 et 1
etc...
Enfin après c'est mon avis hein, mais c'est vrai qu'on peut le faire à coup de décimal.
Mais je vois vraiment pas pourquoi tu fais tout un plat du fait que ce soit en HEXA O.o
Et de toute façon comme l'a dit ssmario2, le -'0' est plus lisible que tout autre -0x30 ou -48 :)
J'en fais pas un plat, mais simplement quà la limite on parle hexa pour parler d'adresses, je veux bien , mais pour quelque chose d'aussi basique que les chiffres, que ce soit en ASCII ou en C, c'est suffisamment simple sans compliquer inutilement..
D'ailleurs :
montre bien que naturellement le PO pense en décimal...
Sinon c'est tout, mais je trouve que, comme on est dans un langage plus évolué que l'assembleur, à quelques très rares exceptions près (masques en particulier), on a aucun besoin de se casser la tête avec lex hexas (les opérations sont pas immédiates, et l'écriture non plus).
Sans plus..