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] Bug somme et number_format


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 20
    Par défaut [Tableaux] Bug somme et number_format
    Salut,

    Si je fais la somme de mon tableau à l'aide de la fonction number_format, je n'arrive pas à la valeur attendu, quelqu'un peut il m'expliquer pourquoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $tab = array(120,177.378,105.23,269.845,270.211,431.365,530.01,338.361,426.612,345.533,1047.583);
    $somme = 0;
    foreach($tab as $tmp){
    	$t = number_format($tmp,2,',',' ');
    	echo $t,"<br />";
    	$somme += $t;
    }
    echo "<br />avec number_format : ",$somme;
    echo "<br />avec array_sum : ",array_sum($tab);
    ?>
    Bien sûr, ce code est un peu stupide, il vient d'un truc plus gros mais le principe est là et je ne peux pas faire autrement que cette méthode.

    Merci par avance.

  2. #2
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Salut, ca vient de number format, en modifiant le code pour afficher la somme au fur et a mesure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php $tab = array(120, 177.378, 105.23, 269.845, 270.211, 431.365, 530.01, 338.361, 426.612, 345.533, 1047.583); 
    $somme = 0; 
    foreach($tab as $tmp)
    {  
    $t = number_format($tmp,2,',',' '); 
    $somme += $t;
    echo $t,"   ",$somme,"<br />";
    } 
    echo "<br />avec number_format : ",$somme; 
    echo "<br />avec array_sum : ",array_sum($tab); 
    ?>
    ca sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    120,00 120
    177,38 297
    105,23 402
    269,85 671
    270,21 941
    431,37 1372
    530,01 1902
    338,36 2240
    426,61 2666
    345,53 3011
    1 047,58 3012
     
    avec number_format : 3012
    avec array_sum : 4062.128
    Tu peux donc voir que le pb est sur le dernier élément : 1 047, a cause de l'espace en séparation ca ajoute 1 au lieu de 1000

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 20
    Par défaut
    Oui effectivement, je l'avais remarqué mais il me les met en entier maintenant, j'comprends rien ...
    Il ne devrait pas pourtant !!!

  4. #4
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Citation Envoyé par NerOcrO
    Oui effectivement, je l'avais remarqué mais il me les met en entier maintenant, j'comprends rien ...
    Il ne devrait pas pourtant !!!
    Comment ça il te les met en entier ?

    dans tous les cas le mieux est de faire la somme AVANT le formatage du nombre.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 20
    Par défaut
    Mon nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $tab = array(120,177.378,105.23,269.845,270.211,431.365,530.01,338.361,426.612,345.533,1047.583);
    $somme = 0;
    foreach($tab as $tmp){
    	$t = number_format($tmp,2,',','');
    	$somme += $t;
    	echo $t,"   ",$somme,"<br />";
    }
    echo "<br />avec number_format : ",$somme;
    echo "<br />avec array_sum : ",array_sum($tab);
    ?>
    ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    120,00 120
    177,38 297
    105,23 402
    269,85 671
    270,21 941
    431,37 1372
    530,01 1902
    338,36 2240
    426,61 2666
    345,53 3011
    1047,58 4058
     
    avec number_format : 4058
    avec array_sum : 4062.128
    La somme se met en entier, pourquoi ???

    Ta remarque est très juste sauf que mon programme affiche les valeurs une à une formaté et je fais en même temps la somme que j'affiche plus bas.
    Mais comme number_format arrondi la valeur au chiffre au dessus, la somme de mes valeurs affichées est différente de la somme affichée en bas.
    La différence est de 0.02 (c'est ridicule) mais mon chef s'en fou, il veut que ça soit égal
    J'espère avoir été clair.

  6. #6
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Pourquoi la somme se met en entier
    => Tu as supprimé le séparateur des milliers du coup ton 1 047,58 avant ca donnait en entier la valeur 1, maintenant c'est 1047,58 donc en entier ca donne 1047,58

    Ensuite pour la somme, si tu veux conserver le number_format tu peux faire comme ca:

    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
    <?php
    $tab = 
    array(120,177.378,105.23,269.845,270.211,431.365,530.01,338.361,426.612,345.533,1047.583); 
    $somme = 0; 
    foreach($tab as $tmp)
    {  
    // 1 - arrondit le chiffre correctement
    $tmpRound = round($tmp, 2);
     
    // 2 - calcule la somme
    $somme += $tmpRound ;
     
    // 3 - format le nombre proprement (avec espace en séparateur des milliers)
    // en repartant tu nombre deja arrondi
    $t = number_format($tmpRound ,2,',',' '); 
     
    // 4 - affiche
    echo $t," ",$somme,"<br />"; 
    } 
    echo "<br />avec number_format : ",$somme; 
    echo "<br />avec array_sum : ",array_sum($tab); 
    ?>

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

Discussions similaires

  1. [Tableaux] bug $_post entre FF 2 et IE 7 ?
    Par Mordoum dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2007, 09h16
  2. [Tableaux] bug boucle foreach
    Par franfr57 dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2007, 11h48
  3. [Tableaux] Bug à l'affichage
    Par teen6517 dans le forum Langage
    Réponses: 14
    Dernier message: 28/02/2007, 09h53
  4. [Tableaux] Bug dans array_unique, ou éléphant ?
    Par Herode dans le forum Langage
    Réponses: 2
    Dernier message: 11/07/2006, 10h24
  5. [Tableaux] Bug dans un code perso
    Par tom06440 dans le forum Langage
    Réponses: 1
    Dernier message: 02/07/2006, 12h38

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