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 :

mystère d'une soustraction


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    708
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 708
    Points : 133
    Points
    133
    Par défaut mystère d'une soustraction
    Bonjour,

    Je n'y comprends rien !!!
    Il s'agit d'une simple soustraction afin de vérifier la balance d'une écriture comptable.
    Client - TVA = Produit
    Autrement il y a un problème d'arrondi à vérifier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ($cpt_cli - $cpt_tva != $cpt_prod)
    echo "ATTENTION, l'écriture de $co_id ne balance pas.
    Cli = $cpt_cli | Tva = $cpt_tva | Prod = $cpt_prod" . '<br>';
    Le message d'alerte s'affiche toujours.
    Or, les chiffres sont toujours exacts, les décimales étant bien marquées par un . et non pas par une virgule.

    Par exemple, message réel :
    ATTENTION, l'écriture de 2980 ne balance pas. Cli = 99.1 | Tva = 17.46 | Prod = 81.64

    Où est le défaut ?

    Merci d'avance.

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ( ($cpt_cli - $cpt_tva) != $cpt_prod)
    echo "ATTENTION, l'&eacute;criture de $co_id ne balance pas.
    Cli = $cpt_cli | Tva = $cpt_tva | Prod = $cpt_prod" . '<br>';
    Il vaut mieux toujours entourer les opérations de parenthèse ;-) (même dans le cas de multiple opérations afin d'être certain du résultat)

  3. #3
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    c'est d'autant plus bizarre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcmp(($cpt_cli - $cpt_tva),$cpt_prod)
    retourne bien 0 ...
    Il n'y aurait pas un problème de typage derrière ça ?

  4. #4
    Débutant
    Homme Profil pro
    Inscrit en
    Avril 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations forums :
    Inscription : Avril 2003
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Je ne pense pas que ce soit les parentheses parce que jai stocke le resultat dans une variable avant de tester la comparaison et cela n'avait pas marcher.
    Essaye number_format() pour formater le resultat de la difference et le produit. Ca a marche chez moi en tout cas.

    a+

  5. #5
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Citation Envoyé par renaudjuif Voir le message
    c'est d'autant plus bizarre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcmp(($cpt_cli - $cpt_tva),$cpt_prod)
    retourne bien 0 ...
    Il n'y aurait pas un problème de typage derrière ça ?
    sans les parenthèses t'as essayé si ça retournait bien 0 ? En général, en PHP si tu met pas les parenthèse il interprète ça comme un echo, c'est à cause de la concaténation.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $a = 5;
    $b = 2;
     
    echo "$a <br />"; // affiche : 5
     
    echo "$a - $b"; // affiche : 5 - 2
     
    echo ($a - $b) // affiche : 3

  6. #6
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    number_format marche bien, c'est vrai.
    mais ça retourne une string, c'est quand même bizarre de faire un calcul en comparant des chaines de caractères.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    708
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 708
    Points : 133
    Points
    133
    Par défaut
    Bonsoir,

    Merci beaucoup de vos réponses.

    La piste du typage est plausible, mais j'ai testé les trois valeurs avec is_float, c'est bien du float.

    Je me demande si ce n'est pas une des valeurs qui a plus de décimales que les autres, d'où erreur systématique.
    Je vous dit ça après le dîner...

    Merci encore.

  8. #8
    Débutant
    Homme Profil pro
    Inscrit en
    Avril 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations forums :
    Inscription : Avril 2003
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Si tu n'as pas trouver mieux essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $valeur = (float) number_format($valeur,n);
    Cela te permet d'uniformiser les valeurs et d'avoir a la fin des float toujours

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    708
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 708
    Points : 133
    Points
    133
    Par défaut
    Re-bonsoir

    J'ai fait le test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    echo $cpt_cli . '<br>';
    echo $cpt_tva . '<br>';
    echo $cpt_prod . '<br>';
    echo $cpt_cli - $cpt_tva - $cpt_prod . '<br>';
    echo round ($cpt_cli - $cpt_tva - $cpt_prod, 2) . '<br>';
    et cela donne ce résultat très bizarre :
    99.1
    17.46
    81.64
    1.42108547152E-14
    0

    Donc, de la soustraction de 3 nombres à 2 décimales, PHP trouve un micro-chouia qui n'existe pas.
    Je ne dis pas que c'est un bug de PHP, peut-être de mon serveur...
    En limitant le résultat à 2 décimales (ou même à 10, j'ai essayé) par round, cela devient bon.

    Donc, mon test devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (round ($cpt_cli - $cpt_tva - $cpt_prod, 2) != 0) echo 'Problème !!!';
    Donc, en pratique, le problème semble résolu.

    Mais d'où sort ce 1.42108547152E-14 ???

    Vous avez idée ?

    Merci d'avance.

    PS : dans les calculs, il faut utiliser round (), pas number_format () qui est une fonction de présentation, pas de calcul.

  10. #10
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Je crois que le 1.42108547152E-14 provient du fait qu'une soustraction n'est pas commutative et donc il ne sait pas trop par où commencer, du coup il retourne la valeur minimale d'un nombre en PHP

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    708
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 708
    Points : 133
    Points
    133
    Par défaut
    Bonsoir,

    Merci de ta réponse, c'est bon à savoir...

  12. #12
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    Je crois que j'ai trouvé... j'avais eu le même problème en javascript...
    C'est un pb de nombre à virgule flotante.

    si vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo number_format($cpt_cli - $cpt_tva,50,"."," ")."<br>";
    echo number_format($cpt_prod,50,"."," ")."<br>";
    ça donne ça :
    81.63999999999998635757947340607643127441406250000000
    81.64000000000000056843418860808014869689941406250000

    Donc c'est pas pareil

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    708
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 708
    Points : 133
    Points
    133
    Par défaut
    Encore merci, je crois que je peux cocher résolu.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/06/2006, 12h02
  2. Une soustraction en sql?
    Par kissmytoe dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2006, 15h52
  3. Réponses: 2
    Dernier message: 22/01/2006, 02h11
  4. arrondir un nombre découlant d'une soustraction de date
    Par bertrand_declerck dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2005, 14h51
  5. Aide sur une soustraction
    Par Job dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/07/2005, 11h44

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