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. #21
    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
    Je pense que cela est du en interne aux valeurs binaires utilisees pour les calculs tu peut regarder du cote de " Floor " ou de " ceil "
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  2. #22
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 288
    Points : 334
    Points
    334
    Par défaut
    J'ai pas mal travaillé avec les float (en 3D) et en effet les float génèrent pas mal de soucis.
    Ci dessous un article sur Code Project (en Anglais) qui traite du sujet:
    http://www.codeproject.com/Articles/...nt-Programming
    Et la référence que donne l'auteur de l'article:
    http://docs.oracle.com/cd/E19957-01/..._goldberg.html

    En gros je pense qu'il n'y a pas de solution. Il faut arrondir à l'affichage.
    Il y a au moins un autre article de CP qui traite su sujet. Des gens proposent des solutions de fonction qui testent l'égalité de manière fiable en passant par des fonctions maison.

  3. #23
    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
    En tout cas, merci à tous de vous être penchés sur mon problème, même s'il n'y a, à priori pas de solution.

  4. #24
    Membre chevronné Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 904
    Points : 2 123
    Points
    2 123
    Par défaut
    Non , pas de solution simple. Nous on a finit par faire notre classe de nombres réels à partir des TBcd de Systools => le nombre est stocké dans une chaîne en interne => plus de soucis de précision.

  5. #25
    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 nirgal76
    Je ne connaissais pas TBcd, j'ai fais un essai avec un bout de code adapte du Net, mais je ne comprend pas trop les résultats obtenu
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "Fmtbcd.hpp"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    struct TBcd
    {
      Byte Precision;
      Byte SignSpecialPlaces;
      Byte Fraction[32];
    };
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    unsigned char cUPin[4];
    Fmtbcd::TBcd bcdPin = IntegerToBcd(12345678);
    Label1->Caption = BcdToStr(bcdPin);
         cUPin[0] = bcdPin.Fraction[3];
         Label2->Caption = cUPin[0];
              cUPin[1] = bcdPin.Fraction[2];
              Label3->Caption = cUPin[1];
         cUPin[2] = bcdPin.Fraction[1];
         Label4->Caption = cUPin[2];
    cUPin[3] = bcdPin.Fraction[0];
    Label5->Caption = cUPin[3];
    }
    //---------------------------------------------------------------------------
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #26
    Membre chevronné Avatar de nirgal76
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 904
    Points : 2 123
    Points
    2 123
    Par défaut
    un exemple pour faire une addition de 2.3 + 0.1 et l'afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "StBcd.hpp"  
     
    [...]
     
    Stbcd::TBcd op1;
    Stbcd::TBcd op2;
    Stbcd::TBcd resultat;
     
    ValBcd_C("2.3", op1);
    ValBcd_C("0.1", op2);
    AddBcd_C(op1, op2, resultat);
     
    ShowMessage(StrGeneralBcd(resultat));
    Bon après, on a fait une classe et redéfinit les opérateurs, constructeurs etc pour l'utiliser comme un type standard

  7. #27
    Membre habitué
    Homme Profil pro
    Chercheur génie électrique
    Inscrit en
    Mai 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur génie électrique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 263
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par futneguet Voir le message
    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
    J'ai utilisé la méthode suivante pour récupérer la vraie valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double test = StrToFloat(EditMO->Text);

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