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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 605
    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 605
    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 089
    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 089
    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 605
    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 605
    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

+ 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