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 :

Réccuperer un Edit dans un float


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 115
    Par défaut Réccuperer un Edit dans un float
    Bonjour à toutes et à tous,

    j'ai besoin de votre aide car il y a un truc que j'arrive pas du tout à comprendre ...

    En faite je dispose d'un objet TEdit dans lequel on écrit des valeurs à virgules.
    J'aimerais réccupérer cette valeur et faire des opérations dessus.

    j'ai donc fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float flTaux;
     
    flTaux = StrToFloat(EditTaux->Text);
    En faisant ceci si le nombre de chiffre après la virgule est supérieure à 1, le float flTaux ne correspond plus au contenu de l'edit.

    Exemple :

    Edit=1.5 => flTaux=1.5
    Edit=1.5475 => flTaux=1.547500658
    Edit=54.8474 => flTaux=54.847400425

    Alors j'ai copier le contenu dans de l'Edit dans un AnsiString et là quelques soit le nombre de chiffres après la virgule l'AnsiString contient la bonne valeure. Mais si je le convertis en Float ben rebelote, il ajoute des chiffres autres....

    Cordialement

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Utilise plutôt un double à la place d'un float:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double flTaux;
    flTaux = StrToFloat(EditTaux->Text);

  3. #3
    Membre très actif Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 923
    Par défaut
    Une variante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double flTaux = EditTaux->Text.ToDouble();

  4. #4
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    Le problème se produirait aussi, bien que nettement plus loin après la virgule, avec des double. C'est tout simplement du au fait que la représentation des nombres à virgule de float et double n'est pas représentable exactement en décimal, et vice-versa.
    Par exemple, la représentation IEEE 754 en 32 bits ne dispose que de 23 bits pour représenter la mantisse, ce qui ne représente qu'un peu plus de 8 millions de possibilités, qui de plus ne tombent pas "juste" avec les nombres à base 10, car cette mantisse est un nombre binaire.
    Par exemple, le nombre 54.8474 a pour représentation la plus proche 0x425b63bd, ce qui vaut 54.847401. 0x425b63be vaudrait 54.847404, et 0x425b63bc vaudrait 54.847397.

    C'est un problème très classique, qui fait qu'on doit prendre des précautions en ingénierie lorsque, par exemple, on place en coordonnées "avion" une pièce dessinée en coordonnées locales: on peut avoir des surprises, non seulement au niveau des coordonnées finales, mais surtout au niveau des propriétés de haut niveau des pièces, comme leur topologie, qui conditionne souvent leur usinage. (Edit: je précise: si un élément d'un pièce à un segment allant des coordonnées (0.1,0.36) à (0.13, 0.345), on peut représenter ces nombres très précisément car les 23 bits de mantisse jouent à plein sur les parties fractionnaires. Si par contre on "place" l'élément dans un objet de grande taille comme un bâtiment ou un avion, les nouvelles coordonnées sont du genre (53668.1,-27055.36) et là il devient bien plus difficile de définir avec la même précision un petit écart).

    En finance, ces approximations sont bien entendu inacceptables, et on dispose de classes spéciales autorisant toute opération sur toute somme, vraie à la plus petite unité de compte près.

  5. #5
    Membre très actif Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 923
    Par défaut
    Tout à fait, voila pourquoi ici à mon taf, on a développé notre propre classe TReel à base de BCD (à partir de la classe TBCD des composant Systools). le réel est codé en interne sous forme de chaine (de taille dynamique) pour n'avoir aucune perte de précision. Il a juste fallu redéfinir les opérateurs necessaires afin de les utiliser comme des double. et donc, on utilise pratiquement plus de double/float.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 115
    Par défaut
    Merci beaucoup de vos réponses.

    Donc pour faire simple y a pas de moyens a part de developper comme Nirgal76 une classe. Juste pour faire 2 multiplications c'est un peu trop je pense.

Discussions similaires

  1. edit dans messagebox
    Par didi59650 dans le forum Delphi
    Réponses: 3
    Dernier message: 06/06/2006, 11h45
  2. un char dans un float
    Par speedcore dans le forum C
    Réponses: 7
    Dernier message: 10/05/2006, 16h54
  3. Edition dans un ListCtrl
    Par Rupella dans le forum MFC
    Réponses: 2
    Dernier message: 22/02/2006, 15h17
  4. utilisation du contenu d'un champ edit dans une requete sql
    Par amri2006 dans le forum C++Builder
    Réponses: 2
    Dernier message: 23/01/2006, 16h05
  5. [MFC]Champ d'edition dans une Toolbar?
    Par kacedda dans le forum MFC
    Réponses: 3
    Dernier message: 08/07/2005, 11h11

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