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 :

Arrondir une valeur selon ses décimales


Sujet :

Langage PHP

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 30
    Par défaut Arrondir une valeur selon ses décimales
    Bonjour,

    Je cherche à arrondir une valeur selon sa décimale, plus particulièrement le dernier chiffre. Exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    12.458 -> doit renvoyer 12.46
    12.454 -> doit renvoyer 12.45
    12.45555556 ->doit renvoyer 12.46
    12.4555555 -> doit renvoyer 12.45
    12.45555554 -> doit renvoyer 12.45
    La règle : on part de la 3e décimale.
    - Si elle est < 5 : on arrondit à la 2ème décimale inférieure
    - Si elle est > 5 : on arrondit à la 2ème décimale supérieure
    - Si elle est = 5 : on vérifie la décimale suivante suivant la même règle
    - S'il n'y a que des 5 : on arrondit à la 2ème décimale inférieure

    J'ai essayé de faire une fonction d'analyse des décimales, mais ça ne me semble pas être une bonne solution.

    J'ai d'assez bons résultats avec la fonction sprintf() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    12.458 -> 12.46
    12.454 -> .12.45
    12.45555556 -> 12.46
    12.45555554 -> 12.46
    12.45555555 -> 12.46
    Les deux derniers résultats ne suivent pas ma règle, donc c'est loupé.

    Avez-vous une solution pas trop usine à gaz, ou un conseil pour mieux utiliser sprintf() ?

    Merci pour votre aide.

  2. #2
    Membre émérite Avatar de Atomya Rise
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Février 2009
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2009
    Messages : 443
    Par défaut
    Pour arrondir un nombre à virgule flottante, il faut utiliser la fonction round()

    Ceci renverra 5.06 :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    echo round(5.055, 2);

    Le premier paramètre est la valeur à arrondir, et le deuxième paramètre est le nombre de chiffre après la virgule.

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Utilise la fonction round.

    A+.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 30
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    round(12.45555554, 2) -> 12.46
    round(12.45555555, 2) -> 12.46
    Cela ne correspond au résultat que je souhaite

  5. #5
    Membre émérite Avatar de Atomya Rise
    Femme Profil pro
    Développeuse Web
    Inscrit en
    Février 2009
    Messages
    443
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeuse Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2009
    Messages : 443
    Par défaut
    Citation Envoyé par 00624 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    12.458 -> doit renvoyer 12.46
    12.454 -> doit renvoyer 12.45
    12.45555556 ->doit renvoyer 12.46
    12.4555555 -> doit renvoyer 12.45
    12.45555554 -> doit renvoyer 12.45
    La règle : on part de la 3e décimale.
    - Si elle est < 5 : on arrondit à la 2ème décimale inférieure
    - Si elle est > 5 : on arrondit à la 2ème décimale supérieure
    - Si elle est = 5 : on vérifie la décimale suivante suivant la même règle
    - S'il n'y a que des 5 : on arrondit à la 2ème décimale inférieure
    Ce n'est pas logique...
    Tu dis que quand la troisième décimal est inférieur à 5 on doit arrondir la 2éme décimale à son inférieur... Or dans ton exemple, tu l'arrondis à la supérieur !

    regarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12.454 -> doit renvoyer 12.45
    Je pense qu'il faut revoir ton raisonnement, car comme ceci, impossible de trouver quelque chose de concret.... et donc, on ne peut établir de fonction logique.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    je pense que ce qu'il cherche c'est les arrondis un peu exotiques :
    ROUND_HALF_TOWARDS_ZERO // ROUND_HALF_AWAY_FROM_ZERO
    Un peu de doc ici

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 30
    Par défaut
    Atomya_Rise, je ne comprend pas ta remarque...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12.454 -> doit renvoyer 12.45
    12.45 est bien arrondi à l'inférieur (c'est ce que je veux), et non au supérieur (qui serait 12.46).

    Pour 12.454 je veux bien obtenir 12.45, en gros si j'ai 454 j'arrondis à 450, si j'ai 456 j'arrondis à 460. Si j'ai 4555555 j'arrondis à 450, idem si j'ai 45555554, par contre 45555556 doit devenir 460.

    Je me suis peut-être mal exprimé, tu dis "arrondir la 2éme décimale à son inférieur", moi je dis "arrondir à la 2ème décimale inférieure", je ne suis pas sûr que cela ait le même sens

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Et si tu as 12.45550556 et 12.45557556, tu veux que ça retournent quoi?
    En fait, c'est un peut bizar

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 30
    Par défaut
    12.45550556 doit renvoyer 12.45 (5e décimale = 0 donc arrondi de la 2e décimale à la valeur inférieure)
    12.45557556 doit renvoyer 12.46 (5e décimale = 7 donc arrondi de la 2e décimale à la valeur supérieure)

    "C'est bizarre", c'est un pléonasme pour "demande client" non ?

  10. #10
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    effectivement c'est bizarre mais à vrai dire plus rien ne m'étonne...
    une approche simple pour la résolution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
     
    $precision = 2;
     
    $a = 12.45550556;
    $b = 12.45555555;
     
    $c = ($a <= $b) ? floor($a*$precision*10) / ($precision*10) : round($a, $precision); // = 12.45
     
    $a = 12.45557556;
    $c = ($a <= $b) ? floor($a*$precision*10) / ($precision*10) : round($a, $precision); // = 12.46
     
    ?>

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 30
    Par défaut
    Bonjour,

    C'est une bonne idée, mais pourquoi faire une comparaison de deux valeurs avant ? Je cherche à faire cette opération pour arrondir des sommes en euros, donc je n'ai pas de chiffre de référence pour comparer. Ou alors je n'ai pas compris le raisonnement

  12. #12
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    C'est soit tu parcours tes décimales après la précision une à une et dès qu'elle est inférieure à 5 tu sais comment arrondir,
    soit tu prends une valeur de référence médiane que tu compares avec ta valeur et en fonction tu sauras comment arrondir (mon approche)

    Edit:
    Tu remarqueras qu'on ne fait pas deux arrondis :
    - dans un cas on fait un truncate
    - dans l'autre un arrondi

Discussions similaires

  1. Arrondir une valeur décimale variable
    Par arkham55 dans le forum ASP.NET
    Réponses: 4
    Dernier message: 02/12/2010, 16h03
  2. Spliter une valeur selon des mots spécifiques
    Par witch dans le forum Langage
    Réponses: 15
    Dernier message: 03/10/2008, 11h10
  3. arrondir une valeur récupérée dans une textbox
    Par jffaber dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/06/2008, 17h11
  4. [CR XI] - probleme pour arrondir une valeur
    Par campia dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 11/03/2008, 13h32
  5. [8.5][formule] Arrondir une valeur au supérieur
    Par ickyknox dans le forum Formules
    Réponses: 3
    Dernier message: 07/05/2007, 16h41

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