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 :

Nombres flottants et affichages bizarres


Sujet :

Langage PHP

  1. #1
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut Nombres flottants et affichages bizarres
    Bonjour,
    Je cale depuis un certain temps sur un bête problème de calcul de prix.
    J'extraits d'une base de données un prix en float et un pourcentage en int afin de faire une simple réduction de pourcentage. L'affichage des résultats m'affiche pourtant des résultats étranges et aléatoires. Au fur et à mesure de mes bidouilles, j'ai eu des ? ou des @ affichés à la place des unités, des NaN, maintenant d'autres lettres, le tout pouvant parfaitement changer lors d'un rafraîchissement de la page (ça s'affiche également quelquefois correctement).

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //prix de l'article
    $tPrix = round($annonce["prix"],2);
    //pourcentage sur l'article
    $tReduction = round($annonce["montant_reduction"],2);
     
    //calcul du pourcentage
    												$nPrix = ($tPrix/100)*(100-$tReduction);
    $nPrix = round($nPrix,2);
    //affichage de l'ancien et du nouveau prix
    print $tPrix." ".$nPrix;
    Dans un premier cas, 20% de réduction sur un prix de 20€,
    j'obtiens D 16
    Dans le deuxième cas, 20% sur 19.95, j'obtiens 19.95 15.96,
    mais plus loin avec le même calcul C.95€ 15.96€

    Y-a-til un sauveur dans la salle ? :s

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    On peux voir ce que donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    extract($annonce);
    var_dump($prix, $montant_reduction);
    ? J'espère juste que $prix et $montant_reduction sont bien des nombres en base et que tu n'as pas mis € derrière

  3. #3
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut
    string(2) "20" string(1) "5"
    string(2) "20" string(2) "20"
    string(5) "19.95" string(2) "20"

    La structure :
    prix float
    montant_reduction int(11)

    L'euro je le rajoute à la main évidemment

    Mais rien qu'un print 15.27; me donne ?.27 parfois, faudra qu'on m'explique

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    La manipulation des nombres sous formes de chaines de caractères pose parfois des problèmes avec les flottants. Dans le doute, caste:

  5. #5
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut
    J'ai testé

    $b = 15.27;
    $a = (float)$b;
    print ($a);

    Et print (float)15.27;

    Ca ne change rien.
    Ou je n'ai pas compris ?

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je sêche. T'aurais pas un problème d'encodage au mois ?

  7. #7
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut
    Ma page est en utf8, ma table en utf8 et connexion par pdo en utf8. Je n'ai jamais eu de problème d'encodage auparavant mise à part pour les guillemets de word et autres trucs spéciaux :/

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    En utilisant cette méthode de calcul, j'ai des résultats corrects, vérifie chez toi si ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $values = array(
    	array('prix' => "20",    'reduction' => "5"),
    	array('prix' => "20",    'reduction' => "20"),
    	array('prix' => "19.95", 'reduction' => "20"),
    );
     
    foreach ($values as $v) {
      extract($v);
      $prix -= $prix * ($reduction / 100);
      echo sprintf('%.3f<br />', $prix);
    }

  9. #9
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut
    Pas eu le temps de m'en occuper aujourd'hui, je teste ça lundi

  10. #10
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut
    Finalement, utiliser simplement printF semble avoir résolu le problème, merci.

  11. #11
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut
    Pfiu en fait non ...



    En épluchant Google je ne trouve personne ayant ce type de problème.
    Images attachées Images attachées  

  12. #12
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut
    J'attends toujours mon sauveur

  13. #13
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est SUPER étrange, je peux voir comment tu fais ton printf ? As-tu essayé ma solution avec sprintf ?

    Y'a quelque chose qui aurait dû me faire tilter dès le début, si tu as des NaN, c'est probablement que JavaScript s'en mèle, t'as jeté un oeil de ce coté là ?

  14. #14
    Inactif  
    Inscrit en
    Septembre 2011
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 100
    Points : 122
    Points
    122
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo sprintf('%.2f', 20.00);
    Me donne D00?

    Désaciver javascript n'a rien changé

  15. #15
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    On regarde pas au bon endroit, le problème n'est pas là.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo sprintf('%.2f', 20.00); // affiche bien 20.00
    Il faut voir qu'est ce qui est fait concrètement dans ta page, là je ne peux pas t'aider.

Discussions similaires

  1. Affichage nombres flottant réels dans memo line
    Par edmond1 dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/01/2015, 02h50
  2. [TP] Affichage bizarre sous XP
    Par DioManU dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 08/06/2006, 11h52
  3. Réponses: 4
    Dernier message: 12/10/2005, 21h22
  4. nombres flottants arrondis aux 5 centimes
    Par nstubi dans le forum Langage
    Réponses: 3
    Dernier message: 17/09/2004, 09h02
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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