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 du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    Slt

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

    -2 pour deux chiffres apres la virgule

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    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 du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    Par défaut
    Oui mais si tu essaies de stocker le résultat dans un float, ça ne marche pas

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    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 du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float F = StrToFloat(S);
    ne marche pas car F vaut toujours 2,40000000954

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

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

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

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    Par défaut
    çà j avais compris , plus globalement j entendais

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    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 du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    Par défaut
    Le problème c'est que je veux le stocker dans un float, pas dans un AnsiString.

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

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

  15. #15
    Membre actif
    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
    Points : 242
    Points
    242
    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.
    Gilbert PASQUALINI

  16. #16
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Points : 713
    Points
    713
    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 du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    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
    Points : 3 766
    Points
    3 766
    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
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  20. #20
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 107
    Points : 46
    Points
    46
    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