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

JavaScript Discussion :

Math.round, c'est plus compliqué que vous le pensez ! =)


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Math.round, c'est plus compliqué que vous le pensez ! =)
    Bonjour,

    Je tente d'effectuer le calcul suivant en JavaScript : 1459 photocopies à 0.095$ chacune. Le calcul avec 'calc' de Windows donne :

    En arondissant, on obtient 138.61$. C'est le montant que je recherche.

    J'effectue donc la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.round((1459*0.095)*100)/100;
    Le résultat donne : 138.6. À 2 décimales, ca donne donc 138.60 ??? En poussant un peu plus loin, j'effectue la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javascript:alert(((1459*0.095)*100));  //j'ai enlevé le divisé par 100 pour voir le résultat intermédiaire
    Le résultat donne : 13860.499999999998 ???

    Si on effectue le divisé par 100 à cette valeur, on obtient 138.60[4], arrondi cela donne donc toujours : 138.60.

    Pour le même calcul (1459*0.095)*100, 'calc' de Windows donne : 13860.5, ce qui est toujours exact.

    Êtes-vous capable d'expliquer ce comportement ? Encore mieux, pouvez-vous améliorer la formule pour corriger ce problème et obtenir la bonne valeur en JavaScript ?

    NOTE : Le calcul suivant donne le même type d'erreur. Vous pourrez tester votre nouveau code avec ce cas également : 371 photocopies à 0.095$ devrait donner 35.25$ et non 35.24$.

    Merci !

    Patric Côté
    Québec / CANADA

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 656
    Points
    66 656
    Billets dans le blog
    1
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par patriccote Voir le message
    Êtes-vous capable d'expliquer ce comportement ?
    +1 SF, il y a plein de bonnes sources sur le sujet ^^

    @Patric : si tu veux te faire du mal, en revanche...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (9999999999999999 == 10000000000000000) alert("wtf ?!");

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  4. #4
    Candidat au Club
    Inscrit en
    Septembre 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    En allant lire la FAQ : http://javascript.developpez.com/faq...ript#NBDecimal et en testant la fonction toFixed(), ceci règlera effectivement mon problème. Par contre, les navigateurs < IE 5.5 et Netscape 6 ne supportent pas ce code, ce cas devra être géré indépendamment.

    L'utilisation du code suivant qui semble très populaire sur le Net ne répond malheureusement pas à mes besoins puisque le calcul ne donne pas toujours le bon résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.round((1459*0.095)*100)/100;
    Je tente encore de comprendre pourquoi cette technique est largement suggéré sachant que l'arrondi n'est pas toujours exact ?!?

    Merci de m'avoir pointé dans la bonne direction et ainsi d'avoir réglé ma problématique !

    Patric Côté
    Québec / CANADA

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 957
    Points : 44 121
    Points
    44 121
    Par défaut
    tu peux également travailler sur des entiers, là pas de problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var nombre = 1459;
    var prix1000 = 95;
    alert( nombre * prix1000 /1000);
    les navigateurs < IE 5.5 et Netscape 6 ne supportent pas ce code, ce cas devra être géré indépendamment
    il ne doit pas en rester beaucoup...

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

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. Réponses: 184
    Dernier message: 23/10/2013, 00h57
  3. Quel est le développeur le plus fainéant que vous ayez rencontré ?
    Par Gordon Fowler dans le forum Actualités
    Réponses: 101
    Dernier message: 13/03/2013, 14h45
  4. Réponses: 85
    Dernier message: 08/02/2011, 18h02
  5. Réponses: 14
    Dernier message: 13/08/2010, 10h14

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