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

Langage Delphi Discussion :

Obtenir un résultat exact lors de la soustraction de deux nombres


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Obtenir un résultat exact lors de la soustraction de deux nombres
    Bonjour,

    Avec Delphi 6, cette simple soustraction (cf. ci-dessous) ne donne pas 0.1 mais 0.099999999627... ?

    x1 := 10000000.2 ;
    x2 := 10000000.1 ;
    d1 := x1 - x2 ;

    Sachant qu'il s'agit là d'un résultat intermédiaire, éventuellement multiplié par 10000 ou répété 2000 fois le tout additionné... le résultat final n'est pas terrible!

    Deux questions :
    - Pourquoi ?
    - Comment faire pour avoir le résultat exact ?

    Grand merci par avance
    Moustache
    Pegase

  2. #2
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut


    http://delphi.developpez.com/faq/?pa...e#arrondirreel

    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
    function Arrondir(nombre : extended ; nbDecim : integer) : extended;
    var
      p10 : extended;
    begin
      { 2 étant le cas le plus fréquent, on le traite directement }
      if (nbDecim = 2) then
        result := round(nombre * 100) / 100
      else
      begin
        p10 := Power(10,nbDecim);
        result := round(nombre * p10) / p10;
      end;
    end;
     
     
    procedure TForm1.Button5Click(Sender: TObject);
    var
      X1, x2, d1: Extended;
    begin
      x1 := 10000000.2 ;
      x2 := 10000000.1 ;
      d1 := x1 - x2 ;
      //ShowMessage(floatToStr(d1));
      //ShowMessage(FormatFloat('0', StrToFloat(floatToStr(d1))));
     
     
      //------- En utilisant la fonction ci-dessus ----------------//
      Showmessage(floatToStr(arrondir(d1, 1)));  //(0.099999999627,1)));
      //------/ En utilisant la fonction ci-dessus ----------------//
     
     
      //------- Ou bien SANS UTILISER la fonction ci-dessus -------//
      ShowMessage(floatToStr(SimpleRoundTo(d1, -2)));
      //------/ Ou bien SANS UTILISER la fonction ci-dessus -------//
     
     
    end;
    @+

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 740
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 740
    Points : 13 283
    Points
    13 283
    Par défaut
    Travailler avec des réels en informatique sera toujours un problème . Mais, une erreur de 0.000000000373 sur une soustraction à une décimale est vraiment négligeable (Même multipliée par 10000).

    Habitue-toi à toujours tester ou afficher ton résultat au nombre de décimal qui t'intéresse.

    Pour la comparaison, tu as différentes fonctions à disposition dans l'unité Math.
    Pour l'affichage, FormatFloat ou Format.

  4. #4
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 341
    Points : 392
    Points
    392
    Par défaut
    Pour aller plus loin :
    - la norme IEEE 754par l'exemple !
    - ou dans le même esprit : ici
    "Je n'ai jamais rencontré d'homme si ignorant qu'il n'eut quelque chose à m'apprendre."
    Galilée

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/07/2012, 17h28
  2. [MySQL] soustraction de deux nombre de type double
    Par magda62 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/06/2009, 15h00
  3. Réponses: 3
    Dernier message: 07/05/2009, 10h31
  4. MySQL: obtenir les résultats de la dernière insertion
    Par TNorth dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/05/2006, 17h44

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