Drole de nombres flottants

Résolu
ODLCITEINFO Messages postés 10 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 29 décembre 2010 - 27 déc. 2010 à 22:24
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 29 déc. 2010 à 15:53
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

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

Dubois77
3
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
28 déc. 2010 à 09:03
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
3
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
28 déc. 2010 à 09:28
Mais aussi simplement format
ShowMessage(Format('%8.2f et %8.1f',[U,L]));

@+yanb
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
28 déc. 2010 à 16:01
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
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
29 déc. 2010 à 01:20
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).
3
ODLCITEINFO Messages postés 10 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 29 décembre 2010
28 déc. 2010 à 17:31
Florent LEMAITRE


Okai, j'ai un résultat correct, Merci beaucoup tous, je me suis penché pour des variables extended.
0
ODLCITEINFO Messages postés 10 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 29 décembre 2010
29 déc. 2010 à 15:30
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.
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
29 déc. 2010 à 15:53
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
0
Rejoignez-nous