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

Delphi Discussion :

Problème virgule flotante


Sujet :

Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 537
    Billets dans le blog
    67
    Par défaut Problème virgule flotante
    Bonjour à tous !

    Mon problème est assez clair:

    j'ai une cellule d'1 StringGrid qui contient '1,20'

    or je souhaite sur OnDrawCell tester la valeur de cette cellule pour éventuellement la mettre la cellule en rouge si sa valeur depasse 1 certain seuil.


    Donc je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Valeur:= StrToFloat(Cells[ACol,ARow]) ;
    et alors j'ai valeur=1.2000000000124548

    au lieu de valeur=1.20

    et donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (Valeur>1.20) Then
              Brush.Color := clRed;

    ma cellule passe en rouge alors quel ne devrait pas


    Avez vous une idée au niveau de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Valeur:= StrToFloat(Cells[ACol,ARow]) ;
    Merci à vous,

    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  2. #2
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Le problème est classique un nombre flottant n'est pas une valeur exacte.

    pour tester l'égalité d'un nombre flottant, il faut introduire un "delta"
    du style pour comparer 2 flottant a et b

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if abs( a - b ) <= delta
      then showmessage( 'les 2 valeurs sont égales' )
    else 
      if abs( a - b ) > delta
        then showmessage( 'a est plus grand que b' )
        else showmessage( 'b est plus grand que a' )
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 68
    Par défaut
    valeur=1.2000000000124548

    Vous pouvez aussi utiliser cette méthode...

    Nombre:=INT(valeur*100)/100
    Ce qui donne 1.20

  4. #4
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Citation Envoyé par Faucon
    valeur=1.2000000000124548

    Vous pouvez aussi utiliser cette méthode...

    Nombre:=INT(valeur*100)/100
    Ce qui donne 1.20
    je crois pas que cela change grand chose (et meme si ca marche sur ce cas precis, il pourrait ne pas marcher dans d'autres cas).

    Ceci arrondi ton nombre a 2 Décimales, mais au finale est restocké dans un flottant non ?
    -> le problème subsiste, et il est fort probable que ce ne soit pas "pile" 1.2 qui est stocké.
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 017
    Par défaut
    Valeur est un Single ? Double ? Extended ...

    Si tu peux n'avoir que 4 digits, utilise le Currency qui est un type réel avec un décalage de la virgule est ultra précis pour 4 digits ...

    Nombre:=INT(valeur*100)/100
    il existe RoundTo aussi (à partir de D6, je crois)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 537
    Billets dans le blog
    67
    Par défaut
    TicTacToe,

    dans ton cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if abs( a - b ) > delta
        then showmessage( 'a est plus grand que b' )
    mais si on as:

    if abs( 1.00 - 1.20 ) > 0.0001
    then showmessage( '1.00 est plus petit que 1.20' )


    Quand dis tu ?


    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 537
    Billets dans le blog
    67
    Par défaut
    merci à tous,

    ShaiLeTroll,

    Valeur est du type single..
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  8. #8
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 537
    Billets dans le blog
    67
    Par défaut
    J'ai utilisé currency, pour le moment ca a l'air de marcher...

    @+
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 017
    Par défaut
    Tout s'explique !
    le Single est très mauvais pour les arrondis ... passe en Double, normalement ça devrait être mieux, tu peux passer en Extended aussi mais cela peut être plus lent (ça dépend vraiement du processeur, ... il y a eu un débat une fois sur un forum ici ou phidels, sur la Gestion du flottant IEEE 754 sur les proc x86...)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 537
    Billets dans le blog
    67
    Par défaut
    ShaiLeTroll, Tu dis que ca depend du processeur,

    donc si j'installe mon appli sur un autre poste je ne suis pas garanti d'avoir le bon résultat même avec currency ou double ?
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  11. #11
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 017
    Par défaut
    Ce qui dépend tu processeur c'est la différence de temps entre l'utilisation entre un Single Double ou Extended ... pas comment les résultats qu'ils donnent car l'on reste en x86 compatible ...

    T'inquiète pas, si tu dois gérer des Euros, utilise Currency, c'est un type Delphi sur 64bit, qui sera partout pareil ...

    Pour le Double, c'est si tu dois faire plus 4 chiffres après la virgule, cela devrait être partout pareil, je pense vu que c'est la norme IEEE 754 qui est utilisé pour tous les processeurs, c'est le type le plus utilisé (par défaut pour la Base de Données), tu peux considérer que 10 chiffres après la virgule sont bon, après ...

    Ensuite, si c'est pour calculer Pi, faire une recherche sur le forum, on a évoqué les chiffres à virgule réparti en tableau de int ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  12. #12
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 537
    Billets dans le blog
    67
    Par défaut
    Il s'agit de mesures médicales au format genre 00.00 ou 0.00 donc je vais garder le currency...

    Merci à toi je tag résolu,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Extended ou Currency.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 68
    Par défaut
    Je sais que c'est résolu mais je rectifie une erreur que j'ai commise.

    Nombre:=INT(valeur*100)/100 (c'est faux)
    Nombre:=INT(valeur*100+0.5)/100 (c'est correct)

    Mille excuses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/01/2015, 10h06
  2. Réponses: 6
    Dernier message: 25/10/2013, 12h20
  3. Problème virgule / point sur float ?
    Par enki.bilal dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 29/08/2011, 13h50
  4. Problème virgule flottante
    Par cretindezalpes dans le forum Delphi
    Réponses: 18
    Dernier message: 15/06/2007, 11h34
  5. Problème virgule
    Par Florent PORRAS dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/08/2004, 10h16

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