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 :

[Tableaux] erreur de calcul


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Points : 77
    Points
    77
    Par défaut [Tableaux] erreur de calcul
    Bonsoir,

    Je me permets de vous soumettre un petit problème que je rencontre lors de calculs en PHP.

    Je calcule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $solde=$apayer-$paye;
    echo $solde;
    Les valeurs sont chargées à partir d'une base mysql et sont des champs 'double'.

    Pourquoi, si $apayer=46.75 et que $paye=46.75, mon solde calculé est de 7.1054273576E-15 ?

    Où est mon erreur ?

    Merci de m'aider.

    Didier

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    essaye fprintf pour avoir une sortie formater
    voirhttp://fr2.php.net/manual/fr/function.fprintf.php

  3. #3
    Membre régulier Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Points : 77
    Points
    77
    Par défaut
    Ca me donne ça :
    Fatal error: Call to undefined function: fprintf()

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    C'est un simple probleme de précision, je crois que tu peux fixer ça dans php.ini (se reporter au manuel php pour les histoire de précision)

    un simple te suffira

  5. #5
    Membre régulier Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Points : 77
    Points
    77
    Par défaut
    Ca ne change rien. Quelques soient les chiffres utilisés (pour autant qu'ils aient une virgule) si le résultat de la soustraction est 0, c'est affiché ainsi. Si le résultat n'est pas égal à 0, il n'y a pas de problèmes.

    Dans la base mysql les montants sont indiqués avec 2 chiffres derrière la virgule. Je ne comprends pas.

  6. #6
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    quel est ton code qui affiche ?

  7. #7
    Membre régulier Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Points : 77
    Points
    77
    Par défaut
    Le code qui calcule le total :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        //calcul du montant total des soins
        $rq="SELECT montant,hr FROM fiche WHERE nump='$nump'";
        $result = mysql_query($rq) 
          or die ("<span class='white'>Erreur de lecture ! : </span>".mysql_error());	
        while($row = mysql_fetch_row($result)){
          $montant = $row[0];
          $hr      = $row[1];
          $total_apayer=$total_apayer+$montant;  //coût total des soins
          $total_hr=$total_hr+$hr;
        }
    Le code qui calcule le total payé est similaire mais va chercher les infos dans une autre table.

    L'affichage est fait par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        echo "<p class='white'>coût total des soins : $total_apayer €<br />
              montant total payé : $total_paye €<br />
              solde : $solde €<br />
              remboursement de mutuelle total : $total_hr €</p>";
    Voilà. C'est rien que du très simple, en fait.

    Merci de ton aide.

  8. #8
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    number_format($nombre, 2, ',', ' ');
    Ceci affiche 2 nombre après la virgule ainsi que les milliers séparé par en espace (notation française)

  9. #9
    Membre régulier Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Points : 77
    Points
    77
    Par défaut
    Je pratique ainsi : avant le echo d'affichage j'ai inséré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        number_format($solde, 2, ',', ' ');
        number_format($total_apayer, 2, ',', ' ');
        number_format($total_paye, 2, ',', ' ');
    Parce que si c'est ainsi que je dois faire, ça ne marche pas non plus. Pas de point entre les milliers et toujours un zéro pas égal à 0.

  10. #10
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    Citation Envoyé par dleu
    Le code qui calcule le total :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        //calcul du montant total des soins
        $rq="SELECT montant,hr FROM fiche WHERE nump='$nump'";
        $result = mysql_query($rq) 
          or die ("<span class='white'>Erreur de lecture ! : </span>".mysql_error());	
        while($row = mysql_fetch_row($result)){
          $montant = $row[0];
          $hr      = $row[1];
          $total_apayer=$total_apayer+$montant;  //coût total des soins
          $total_hr=$total_hr+$hr;
        }
    Le code qui calcule le total payé est similaire mais va chercher les infos dans une autre table.

    L'affichage est fait par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        echo "<p class='white'>coût total des soins : $total_apayer €<br />
              montant total payé : $total_paye €<br />
              solde : $solde €<br />
              remboursement de mutuelle total : $total_hr €</p>";
    Voilà. C'est rien que du très simple, en fait.

    Merci de ton aide.
    Essaie en définissant explicitement dans ton code PHP le type de tes deux variables qui récupèrent les données de ta base avec la fonction settype(), car apparemment PHP utilise bien des variables double mais la conversion se fait mal de façon automatique j'ai l'impression... Enfin quelquepart y a un problème de conversion String -> double ou double->double apparamment les deux nombres soustraits n'ont pas la même précision, cela n'a rien avoir avec les arrondis ! normalement $a-$a=0 tout le temps en informatique !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    settype($montant,"double");
    settype($hr,"double");
         $montant = $row[0];
          $hr      = $row[1];
    et ensuite tu fais tes calculs.
    Est ce que tous tes champs de ta base de données manipulant des nombres ont bien le même type de données (double ?) ?

  11. #11
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            <?php
            $var = 7.1054273576E-15;
            var_dump($var);
            var_dump(number_format($var, 2, ',', ' '));
            ?>
    Me donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float(7.1054273576E-15)
    string(4) "0,00"
    Donc chez moi ca tourne nickel.

  12. #12
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    ou bien essaie un transtypage genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $monnombre=(double)$valeur;

  13. #13
    Membre régulier Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Points : 77
    Points
    77
    Par défaut
    $monnombre=(double)$valeur;
    Ne change rien sauf la valeur : je n'ai plus 7......E-15 mais 6.8212102633E-13.

    Code:

    <?php
    $var = 7.1054273576E-15;
    var_dump($var);
    var_dump(number_format($var, 2, ',', ' '));
    ?>

    Me donne ceci :
    Code:
    float(7.1054273576E-15)
    string(4) "0,00"
    Ca me donne les mêmes résultats. Mais quand j'affiche $var, il me remet mon 0 kilométrique. Qu'est-ce que je ne pige pas ?

  14. #14
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    comment changes tu le type (code)?


    comment fais tu ton insertion dans la base ?
    (je suis sûr que c'est dû à une erreur de type)

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Mais quand j'affiche $var, il me remet mon 0 kilométrique. Qu'est-ce que je ne pige pas ?
    number_format() retourne une chaine, il faut donc que tu affiches la valeur de retour de cette fonction :o :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo number_format($var, 2, ',', ' ');
    Faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    number_format($solde, 2, ',', ' ');
    ne fait strictement rien !
    Il faudrait faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $solde = number_format($solde, 2, ',', ' ');

  16. #16
    Membre régulier Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Points : 77
    Points
    77
    Par défaut
    Désolé pour la réponse en retard, mais il faut bien bosser un peu

    Ca fonctionne maintenant grâce à vos explications éclairées. Je vous en remercie.

    J'ai juste encore un léger soucis : parfois mon solde est égal à -0.00 €. Un 0 négatif . Qu'est-ce que c'est que ça maintenant ????

  17. #17
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    comment as tu résolu ton problème ? ça vient peut-être de là ?

  18. #18
    Membre régulier Avatar de dleu
    Profil pro
    Inscrit en
    Août 2004
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2004
    Messages : 169
    Points : 77
    Points
    77
    Par défaut
    J'avais effectivement un problème de type : $total_apayer était en double (lu directement depuis la base mysql) mais $total_paye était transformé en varchar par transtypage avant d'intervenir dans le calcul. D'où l'erreur.

    Merci à vous tous pour l'aide et pour les infos sur number_format().

    A+

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    le zéro négatif c'est normal, c'est que ton solde est de -6.8212102633E-13 et si tu utilises number_format, il se doit de donner -0

    j'ai eu le même problème en visual basic et la seule solution que j'ai trouvé alors, c'est de créer une routine afficher_zero, qui avec un if retourne un solde zéro si ce solde en absolu est inférieur à .001 par exemple. Ce n'est pas génial et peut-être que php a des fonctions similaires intégrées mais je ne les connais pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] erreur inconnue
    Par zebougha dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2006, 10h50
  2. [Tableaux] erreur memoire
    Par gorgonite dans le forum Langage
    Réponses: 5
    Dernier message: 17/02/2006, 20h36
  3. erreur sur calcul
    Par Sendo dans le forum Access
    Réponses: 2
    Dernier message: 29/09/2005, 09h46
  4. Rotation erreur de calcul
    Par Speed41 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 09/03/2005, 16h55
  5. C++Builder fait une erreur de calcul
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/01/2004, 22h27

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