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 :

PHP me retourne des sommes à multiples décimales !


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Points : 7
    Points
    7
    Par défaut PHP me retourne des sommes à multiples décimales !
    Bonjour,

    J'ai un site e-commerce et j'ai codé un petit truc pour mon comptable.
    Le code prend les chiffres dont il a besoin dans la base (Produits HT, Livraison HT, Livraison Taxe, Produits Taxe) et les alloue à un numéro de compte comptable.
    Pour ceux qui connaissent, par exemple les ventes produits HT c'est en compte 70700000, etc.

    Ca lui permet de ne pas repointer chaque facture à la main.

    Bref, le code me fait super bien le boulot, mais quand je fais la somme de chaque compte, le résultat me donne des tas de décimales alors que je n'ai que des chiffres à deux décimales dans la base !
    Je ne comprends pas pourquoi !

    Par exemple dans ma base de données j'ai ça :
    411 57.5
    70700000 40.00
    70850000 7.92
    44571 8
    44571 1.58
    411 56.5
    70700000 40.00
    70850000 7.08
    44571 8
    44571 1.42
    411 77.2
    70700000 57.67
    70850000 6.67
    44571 11.53
    44571 1.33

    Et lorsque je demande de me faire la somme pour chaque compte, je me retrouve avec des résultats genre 847.4777777778
    Je ne comprends pas pourquoi une somme de chiffres à deux décimales me donne ça. Du coup, mes résultats sont faux de 2 ou 3 centimes.

    Le code tout simple pour les sommes est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //sql query
    $sql = "SELECT COMPTE, SUM(MONTANT) FROM EXPORT GROUP BY COMPTE";
    $result = $link->query($sql);
    //display data on web page
    while($row = mysqli_fetch_array($result)){
        echo "Total ". $row['COMPTE']. " = ". $row['SUM(MONTANT)'];
          echo "<br />";
    }
    //close the connection
     
    $link->close();
    Vous auriez une idée ?

    Je me demande si c'est pas parce que mes champs sont en VARCHAR (?)

    Merci !

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 769
    Points : 43 954
    Points
    43 954
    Par défaut
    Et avec un round ça donne quoi ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 880
    Points
    1 880
    Par défaut
    Et quelle est la définition de la table ? Je suppose que c'est du Mysql ?
    Si les montants sont effectivement varchar, c'est un data model saugrenu.

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bon finalement, j'ai remplacé le type VARCHAR par DECIMAL avec "2" après la virgule dans la table mysql.

    Ca me ressort bien sûr les montants avec deux chiffres après la virgule, même si je ne comprendrai jamais pourquoi la somme de chiffres type XX,XX me donne XXX,XXXXXXXXX.

    Par contre j'ai un écart de 4 à 5 centimes par mois par rapport à la synthèse du site de vente et pour ça, je n'ai pas d'explication non plus.

    Sans doute des règles d'arrondis qui doivent s'embrouiller sur les multiples articles HT et les TVA, etc.

    Mon Comptable me dit que 4 à 5 centimes d'écart par mois sur un CA de plusieurs milliers d'euros, c'est négligeable.

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 420
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 420
    Points : 15 789
    Points
    15 789
    Par défaut
    ce que vous voyez là est la représentation interne des nombres à virgules flottantes. regardez l'avertissement dans la documentation là :
    https://www.php.net/manual/fr/language.types.float.php

    par contre vous remarquerez que le manque de précision ce fait sur la 8e ou la 9e décimale donc ce n'est pas cela qui peut faire une différence d'un centime par rapport à la somme prévue.

  6. #6
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut
    Haaaaa, les problèmes d'arrondi dans la compta, une galère.
    Chez moi c'est encore plus complexe, le club travaille TVAC et le comptable HTVA et avec la TVA à 21% en Belgique, je ne te dis pas les erreurs de cents

    Essaie une fois de passer par un ARRAY :
    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
    <?php
    //sql query
    $sql = "SELECT COMPTE, MONTANT FROM EXPORT ORDER BY COMPTE";
    $result = $link->query($sql);
    //display data on web page
    while($row = mysqli_fetch_array($result)){
        $array_comptes[$row['COMPTE']]['compte']=$row['COMPTE'];
        $array_comptes[$row['COMPTE']]['somme']=$array_comptes[$row['COMPTE']]['somme']+round($row['MONTANT'],2);
    }
    //close the connection
    *$link->close();
    //visualiser le résultat
    print "<pre>";
    	print_r($array_comptes);
    print "</pre>";
    ?>
    Si c'est correct, un petit foreach pour le comptable
    EDIT : tu pourrais même lui faire assez facilement un petit CSV avec le foreach

Discussions similaires

  1. Tableau PHP sans transtypage des clefs et clefs décimales
    Par rawsrc dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 3
    Dernier message: 01/09/2011, 13h48
  2. Réponses: 4
    Dernier message: 16/10/2008, 10h45
  3. [PHP-JS] Copier des multiples champs dans d'autres
    Par Akim13 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/07/2007, 16h26
  4. Réponses: 3
    Dernier message: 09/05/2007, 11h43
  5. Réponses: 5
    Dernier message: 08/03/2007, 11h57

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