IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Arrondi inexpliqu� avec StrToFloat


Sujet :

C++Builder

  1. #1
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut Arrondi inexpliqu� avec StrToFloat
    Bonjour,

    je veux r�cup�rer une valeur saisie dans un TEdit que je veux stock� dans un float de la mani�re suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    float test = StrToFloat(EditMO->Text) ;
    Cependant, pour certaines valeurs (ex : 2,4), test contient 2,40000000954

    Comment �viter cela (il me faut imp�rativement un float et pas un double)

    Merci

  2. #2
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par d�faut
    Slt

    float test = RoundTo( StrToFloat(EditMO->Text) , -2 );

    -2 pour deux chiffres apres la virgule

  3. #3
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    Merci mais j'ai d�j� test� RoundTo ainsi que FormatFloat mais la variable test vaut quand m�me 2,40000000954

  4. #4
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par d�faut
    int P = AnsiPos(",",EditMO->Text ) ;
    Edit2->Text= Edit1->Text.Delete(P+2,9999);

    donne 2,4

    Tu peux aussi faire un traitement sur les chiffres derriere la virgule pour faire ton arrondi , avant le delete bien sur

  5. #5
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    Oui mais si tu essaies de stocker le r�sultat dans un float, �a ne marche pas

  6. #6
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par d�faut
    int P = AnsiPos(",",EditMO->Text ) ;
    AnsiString S = EditMO->Text.Delete(P+2,9999);
    float F = StrToFloat(S);
    Qu est ce qui ne marche pas ?

  7. #7
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    ne marche pas car F vaut toujours 2,40000000954

  8. #8
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par d�faut
    expliques ce que tu veux faire , sinon on avancera pas

  9. #9
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    R�cup�rer 2,4 et non 2,40000000954 dans mon float, �a parait �vident !

  10. #10
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par d�faut
    �� j avais compris , plus globalement j entendais

  11. #11
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    R�cup�rer un nombre � virgule saisi par un utilisateur puis le stocker dans un champs float d'une structure en vue d'alimenter une bdd.

  12. #12
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par d�faut
    Au moment d alimenter ta bdd

    int P = AnsiPos(",", FloatToStr(TonFloatMalArrondi) ) ;
    AnsiString S = FloatToStrF( TonFloatMalArrondi ,ffFixed ,P,1);

    ou 1 est le nombre de chiffre apres la virgule

  13. #13
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    Le probl�me c'est que je veux le stocker dans un float, pas dans un AnsiString.

  14. #14
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par d�faut
    au moment de creer ta requete d insertion , celle ci est bien ecrite en string , non ?

  15. #15
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2002
    Messages
    481
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2002
    Messages : 481
    Par d�faut
    Le probl�me vient du fait que le nombre 2,4 qui n'a qu'une seule d�cimale, s'il est �crit en base 10, en a une infinit� s'il est �crit, comme les nombres en "float", en base 2. Comme il est tronqu� � 24 d�cimales, son retour en base 10 n'est plus 2,4.

    Je ne pense pas qu'il y ait une solution simple.

  16. #16
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    non car je passe par une structure organis�e comme ma table (car je me sers des donn�es pour d'autres traitements).
    Du coup, lors de l'insertion je me sers de :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    qInsert->Params->ParamValues["costme"]=mastructure.costme;
    mais comme costme est float (c'est la valeur r�cup�r�e), elle vaut 2,40000000954

  17. #17
    Membre �m�rite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par d�faut
    Peux tu introduire un champ suppl�mentaire � ta table ?

    Au cas o� , tu trouves le nombre de chiffres , P , apr�s la virgule , ce serait l entier que tu ins�res dans le champ ajout� .

    La valeur de ton champ , tu la traites avec un ansireplace sur la virgule .

    Ensuite pour retrouver ton nombre d origine , tu as juste � le diviser par 10 puissance P

  18. #18
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    Impossible de modifier la table ni la structure.

  19. #19
    R�dacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par d�faut
    Salut futneguet
    Je ne pense pas que tu peut recuperer directement un flotant avec une valeur ronde directement, il faut ruser
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    String a = (Edit1->Text);
    float b = StrToFloat(a) * 1000; // ajuster 1000 10000 ...correspondant au nombre de chiffre apres la virgule
    b = b/10000;
    Label1->Caption = b;
    tu a toujours un arrondi

  20. #20
    Membre confirm�
    Inscrit en
    Octobre 2002
    Messages
    109
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 109
    Par d�faut
    Merci blondelle mais alors que pour la valeur 2,4 saisi par l'utilisateur
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    float b = StrToFloat(a) * 1000;
    donne bien 2400,
    me redonne plein de chiffre apr�s la virgule (2,40000000954 dans mon cas)

    Bizarre quand m�me ...

Discussions similaires

  1. arrondis faux avec QString::number
    Par Somato dans le forum D�buter
    R�ponses: 11
    Dernier message: 04/12/2008, 08h57
  2. div coin arrondi d�composer avec IE7 ?
    Par fiston dans le forum Balisage (X)HTML et validation W3C
    R�ponses: 4
    Dernier message: 20/05/2007, 16h43
  3. Pb avec StrToFloat
    Par kurkaine dans le forum C++Builder
    R�ponses: 5
    Dernier message: 06/12/2006, 14h16
  4. [Delphi 6] probleme de precision avec StrToFloat()
    Par ludovic tambour dans le forum Delphi
    R�ponses: 12
    Dernier message: 29/11/2006, 17h17
  5. probleme avec strtofloat
    Par copeau31 dans le forum Langage
    R�ponses: 6
    Dernier message: 20/01/2006, 19h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo