Drole de nombres flottants [Résolu]

Signaler
Messages postés
10
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
29 décembre 2010
-
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
-
Florent LEMAITRE


Bonjour tous, j'ai un drôle de problème actuellement, dans mon programme, j'effectue un calcul d'une simple soustraction de nombre flottants quasi entier mon exemple test, c'est 270,7 - 270 mais pour le programme = 0.699999999999989,
J'ai vérifier à chaque instructions quelles étaient les valeurs qui arrivait à cette soustraction, elles sont correct, mais l'égalité sortante est bizzard. j'ai déclaré mes variables en real et ressortent dans un edit en str. Merci de m'éclairé au plus vite

8 réponses

Messages postés
675
Date d'inscription
jeudi 17 avril 2008
Statut
Membre
Dernière intervention
19 février 2019
12
Bonjour
regarde ici
ou
En fait avec google "précision nombres flottants" on trouve beaucoup d'explication sur le sujet
Cordialement

Dubois77
Messages postés
257
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
4 août 2020
9
Salut,
convertie tes real en extended ou utilise le formatage pour plus explications voir l'aide de delphi sur FloatToStrF, FormatFloat ...
Mais les liens de dubois77 ont dus t'éclairer sur le pourquoi du comment...
Exemple :
var
    T, Y, U : real;
    J, K, L : extended;
begin
    T := 270.7;
    Y := 270;
    U := T - Y;
    J := 270.7;
    K := 270;
    L := J - K;
    ShowMessage(FloatToStr(U));
    ShowMessage(FormatFloat('#,##0.00;;Zero', U));
    ShowMessage(FloatToStrF(U, ffGeneral, 7, 2));
    ShowMessage(FloatToStr(L));
end;

@+yanb
Messages postés
257
Date d'inscription
lundi 27 octobre 2003
Statut
Membre
Dernière intervention
4 août 2020
9
Mais aussi simplement format
ShowMessage(Format('%8.2f et %8.1f',[U,L]));

@+yanb
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Salut,

Si tu n'as pas besoin de la précision maximum, tu peux aussi effectuer les calculs sur des Integer. Par exemple:

var A,B : Integer;
begin
A := Trunc(270.7*100);
B := Trunc(270*100);
ShowMessage(Floattostr((A-B)/100));


L'avantage étant que les calculs seront beaucoup plus rapides s'ils sont nombreux et compliqués.

_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
pour completer la reponse de cari, tu peux aussi utiliser les currency. C'est un melange entre float et integer. Techniquement, c'est un int64, dont les 4 derniers chiffres sont conciderés comme decimaux. Par exemple, si ton int64 vaut 123456789, en currency ca fera 12345.6789 . Donc les calculs seront exacts (dans la limite de 4 decimales).
Messages postés
10
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
29 décembre 2010

Florent LEMAITRE


Okai, j'ai un résultat correct, Merci beaucoup tous, je me suis penché pour des variables extended.
Messages postés
10
Date d'inscription
samedi 28 janvier 2006
Statut
Membre
Dernière intervention
29 décembre 2010

Oui quand j'ai cherché des solutions j'ai vu des exemples sur delphibasic mais sa fonctionnais pas, j'avais des erreurs et donc au lieu de chercher je suis retourné au réal. et puis ben j'ai vu extended.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Extrait de l'Aide.

Extended propose une meilleure précision que les autres types réels, mais il est moins portable. Evitez d'utiliser Extended si vous créez des fichiers de données qui doivent être partagés sur plusieurs plates-formes.


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr