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 :

Afficher deux chiffres après la virgule, sans pour autant arrondir la partie décimale


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut Afficher deux chiffres après la virgule, sans pour autant arrondir la partie décimale
    Bonjour,

    Le titre est suffisamment explicite.

    J'ai tenté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    round($Lechiffre * 100)/100;
    ceil($Lechiffre * 100)/100;
    et même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    number_format($Lechiffre ,2,',','');
    Avec round j'ai bien 2 chiffres après la virgule mais arrondi : ex. 3.196 devient 3.2
    Moi je voudrais afficher 3.19

    J'ai écumé le net sans succès, et maintenant je me tourne vers les pros

    Faut-il en passer par une fonction "maison" ?

  2. #2
    Membre éprouvé Avatar de gretch
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2006
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 165
    Points : 1 250
    Points
    1 250
    Par défaut
    edit : ça marche

    pour tronquer ton resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    floor($Lechiffre * 100)/100;

  3. #3
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    La floor() retourne un entier, et non une décimal (ou float).
    Ca n'ira pas je pense.

    Mais tu demande à Php de faire un truc qui n'est pas normal.
    Ca aurait été 3.195, là on se trouve bien à cheval entre 3.19 et 3.2, mais pas 3.196, celui ci doit déboucher à 3.20, c'est la règle.

    La fonction round() d'ailleurs accepte en tout 3 paramètres (dont les 2 derniers sont optionnels) :
    float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )
    La doc Php : http://fr2.php.net/manual/fr/function.round.php
    Par défaut elle arrondie au nombre supérieur, et pour un nombre comme 3.196, quelque soit la valeur du 3ème paramètres ($mode), ça arrondira à 3.2

    Mais si le nombre fait 3.195, la fonction round() fonctionne très bien, faut juste rajouter les bons paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    round(3.195, 2, PHP_ROUND_HALF_DOWN);
    Retourne 3.19


    Faut-il en passer par une fonction "maison" ?
    A mon avis oui.
    Mais tu est conscient que tu change les règles sur les d'arrondis ?
    Si c'est 3.197, 3.198, ou 3.199, faut il arrondir à 3.19 aussi ?
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  4. #4
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    Si c'est 3.197, 3.198, ou 3.199, faut il arrondir à 3.19 aussi ?
    Oui, je comprend que cela soit illogique, mais je dois éviter d'afficher un nombre trop grand dans un tableau HTML.
    Ce nombre est le résultat d'une fonction affine y=ax+b, en base j'insère le nombre en entier pour les calculs, mais l'utilisateur ne veut pas voir au-delà du 2eme chiffre après la virgule.

  5. #5
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    Voici ma fonction permettant de tronquer la décimale d'un nombre, il y a sans doute plus court :

    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
    <?php
    function Reduire_Decimale($nombre,$chiffre_apres_LaVirgule)
    {
        $decimale = explode('.',$nombre);
        $reduction = substr($decimale[1], 0, $chiffre_apres_LaVirgule);
     
        if($chiffre_apres_LaVirgule == 0)
        {
            $nouveau_nombre = $decimale[0];
        }
        else
        {
            $nouveau_nombre = $decimale[0].','.$reduction;
        }
     
        return $nouveau_nombre;
    }
     
     
    echo Reduire_Decimale("3.1962365","2");
    ?>

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    mais je dois éviter d'afficher un nombre trop grand dans un tableau HTML.
    Désolé, je ne vois pas le rapport avec les règles d'arrondis

    En quoi 3.20 serait plus long que 3.19 dans un élément HTML ?
    De plus, dans ce cas là c'est 3.2 qu'on obtient ce qui fait 1 chiffre de moins, ce qui est d'autant plus court, non ?

    Je ne parviens pas à te suivre.

    Pour ma part, pour arrondir un nombre convenablement, c'est ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $chiffre = round($chiffre, 2); // Le 2ème paramètre indique le nombre de décimales
    Par contre, si on prends les exemples de codes que tu as mis, tu applique la fonction round() et après une division :
    round($Lechiffre * 100)/100;

    La division ne faisant pas partie du calcul dans la fonction round(), ça risque de générer à nouveau un nombre avec n décimales.
    Si on veut obtenir un nombre arrondi, il faut que tout l'ensemble du calcul, du chiffre final soit dans la fonction round().
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    En quoi 3.20 serait plus long que 3.19 dans un élément HTML ?
    Effectivement ce n'est pas plus long, seulement 3.2 n'est pas égal à 3.19, et je n'ai pas le droit d'afficher des arrondis mais des valeurs justes à 2 décimales.

    Donc 3.196 devient 3.19 et pas 3.2.

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Donc 3.196 devient 3.19 et pas 3.2.
    Ok ok ...

    Un petit essai avec la fonction Reduire_Decimale(), elle génère une erreur dans le cas où $nombre n'est pas un nombre décimal.
    Je ne sais pas si c'est important, mais au cas où
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Membre actif Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Points : 265
    Points
    265
    Par défaut
    Un petit essai avec la fonction Reduire_Decimale(), elle génère une erreur dans le cas où $nombre n'est pas un nombre décimal.
    Je ne sais pas si c'est important, mais au cas où
    Oui exact, j'ai aussi ajouté la gestion si $nombre = 0

    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
    23
    24
    25
    26
    27
    function Reduire_Decimale($nombre,$chiffre_apres_LaVirgule)
    {
        if($nombre == 0)
        {
            $nouveau_nombre = 0;
        }
            elseif($nombre == is_int($nombre))
            {
                $nouveau_nombre = $nombre;
            }
                else 
                {
                    $decimale = explode('.',$nombre);
                    $reduction = substr($decimale[1], 0, $chiffre_apres_LaVirgule);
     
                    if($chiffre_apres_LaVirgule == 0)
                    {
                        $nouveau_nombre = $decimale[0];
                    }
                    else
                    {
                        $nouveau_nombre = $decimale[0].','.$reduction;
                    }
                }
     
        return $nouveau_nombre;
    }

  10. #10
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    pour faire une troncature, tu n'as besoin que d'une seule ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $trunc = function($var){
    return  floor(100*$var)/100;
    }

    si c'est un arrondi, cf réponse 1.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  11. #11
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    j'ajouterai que si c'est vraiment de la troncature avant affichage, un printf("%.2d", $var) devrait aussi faire des merveilles.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par gene69 Voir le message
    j'ajouterai que si c'est vraiment de la troncature avant affichage, un printf("%.2d", $var) devrait aussi faire des merveilles.
    tu le tronques bien ca va te donner un 3

  13. #13
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    exact.
    La diablerie est dans les détails.

    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par gene69 Voir le message
    exact.
    La diablerie est dans les détails.

    ca tronques pas non plus...
    tu devrais tester avant

  15. #15
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    ben tu prends un chiffre, tu le transforme en chaine, tu forces le séparateur de décimale à la virgule. Sinon je suis sur que ça marche...
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  16. #16
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je n'ai pas creusé pour savoir le pourquoi du comment, mais quand c'est un entier ça plante toujours

    J'ai modifié un tout p'tit peu, comme ceci :
    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
     
    function Reduire_Decimale($nombre, $chiffre_apres_LaVirgule) {
        $decimale = explode('.', $nombre);
        if (isset($decimale[1])) {
            $chiffre_apres_LaVirgule = ((int)$chiffre_apres_LaVirgule > 0) ? $chiffre_apres_LaVirgule : 0;
            $reduction = substr($decimale[1], 0, $chiffre_apres_LaVirgule);
     
            if($chiffre_apres_LaVirgule == 0) {
                $nombre = $decimale[0];
            }
            else {
                $nombre = $decimale[0].','.$reduction;
            }
        }
        return $nombre;
    }
    Par défaut ça retourne $nombre (le même qu'à l'origine).
    Si c'est 3, ça retourne 3.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  17. #17
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    La floor() retourne un entier, et non une décimal (ou float).
    Ca n'ira pas je pense.
    D'où la combien de multiplier par 100 puis de diviser par 100
    Combine largement répandue en as3 ceci dit en passant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $Lechiffre  = 3.1969;
     
    echo floor($Lechiffre*100)/100;
    // 3.19
     
    echo floor($Lechiffre*1000)/1000;
    // 3.196
    C'est pas ce résultat qu'il faut obtenir ? Peut être que j'ai pas compris la question sinon

  18. #18
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    C'est pas ce résultat qu'il faut obtenir ?
    Et bien je pense oui.
    C'est à arthuro45 de le confirmer tout de même.

    C'est ce qui arrive quand on n'essaye pas.
    Combine largement répandue en as3 ceci dit en passant.
    Tout le monde connait l'ASCII, n'est-ce pas ?
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  19. #19
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Tout le monde connait l'ASCII, n'est-ce pas ?
    ASCII ? Je pige pas

    je parlais d'Action Script 3

  20. #20
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par Madfrix
    ASCII ? Je pige pas

    je parlais d'Action Script 3
    De mieux en mieux.
    Je m'attendais à quelque chose bien plus en rapport avec l'informatique à vrai dire.

    Action Script3, c'est connu ça ?
    (je déconne ... je vais en fâcher plus d'un je sens).


    Blague à part, Action Script je connais(sais), mais Action Script tout court (Flash 5 quoi).
    C'est dire que c'est loin, mais alors ...
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Débutant] afficher valeurs numériques avec deux chiffres après la virgule
    Par bahja29 dans le forum MATLAB
    Réponses: 4
    Dernier message: 07/04/2009, 11h48
  2. Réponses: 7
    Dernier message: 23/01/2008, 17h15
  3. Deux chiffre apres la virgule
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/08/2006, 15h37
  4. Pourcentage avec deux chiffres après la virgule
    Par Oluha dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/03/2005, 13h47
  5. Commande pour afficher des chiffres apres la virgule
    Par manar dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/09/2004, 18h28

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