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 PHP Discussion :

Virgule flottante non fiable


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de myz-rix
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 143
    Points : 114
    Points
    114
    Par défaut Virgule flottante non fiable
    Bonjour,

    Développant un petit programme comptable, je me suis confronter à un problème très très complexe, additionner et soustraire des nombres à virgule flottante ! J'aurai jamais pensé autant galérer pour un truc aussi simple.

    Au final j'ai fait ce petit bout de code pour test, et alors que je devrais trouver un résultat égal à zéro, je trouve un nombre exponentiel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $a = 2523.27 - 2275.37;
    $b = 142.84 + 21.31 + 83.75;
     
    print '<br>RESULTAT '.$a.' + '.$b.' = '.($a - $b);
    // => Résultat affiché = 8.5265128291212E-14

    Absurde, vous avez dit absurde ? si quelqu'un a une idée ou peu me dire si ça fait pareil chez lui.

    Merci

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Représentation binaire des réels...

    Va voir du côté des librairies BC Math et GMP...

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut utiliser les fonctions mathématiques de précision :
    http://php.net/manual/fr/language.types.float.php
    http://www.php.net/manual/fr/ref.bc.php

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Pour tester une égalité de flottants, on peut la plupart du temps se contenter d'une approximation au millionième non ?

    Un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( abs($a-$b) < 1E-10 ) $egalite = true;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 77
    Points : 68
    Points
    68
    Par défaut
    Le mieux c'est de jouer avec un floor ou un ceil ou un round ou number_format autour de chaque nombre

  6. #6
    Membre régulier Avatar de myz-rix
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 143
    Points : 114
    Points
    114
    Par défaut
    Merci c'est tout bon, j'ai fait la solution du:
    abs($a-$b) > 1E-10
    je regarderai les fonctions mathématique plus tard.

    Pour le round à 2 chiffres après la virgule, j'ai essayé et curieusement ça fait pareil.

    En tout cas je suis rassuré, je suis pas fou

    Merci bcp ++

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Faire un round, un ceil ou un floor ne résoudra pas le pb...

Discussions similaires

  1. [D7] Problème de virgule flottante
    Par Magnus dans le forum Langage
    Réponses: 17
    Dernier message: 22/09/2005, 14h56
  2. convertir un edit en virgule flottante
    Par bertrand_declerck dans le forum Langage
    Réponses: 3
    Dernier message: 22/07/2005, 10h07
  3. Réponses: 6
    Dernier message: 16/05/2004, 19h03
  4. [langage] Arithmétique en virgule flottante
    Par marouanitos dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2003, 14h48
  5. [Kylix] Kylix3: Pb de virgule flottante
    Par hubble dans le forum EDI
    Réponses: 1
    Dernier message: 22/06/2003, 16h36

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