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 qui n'arrondit pas


Sujet :

JavaScript

  1. #1
    Membre émérite
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Par défaut Math.round qui n'arrondit pas
    Bonjour à tous.
    Je souhaite arrondir une valeur à deux décimales près.
    Celle valeur étant calculée à partir d'autres.

    Voici le code complet :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
      function calculerMontantTotal(idInput) {
        var isChecked = document.getElementById("echeancier_" + idInput).checked;
     
        var montantTotal = parseFloat(document.getElementById("totalAPayer").value);
        montantTotal = Math.round(montantTotal*100)/100;
     
        var montant = parseFloat(document.getElementById("montant_" + idInput).value);
        montant = Math.round(montant*100)/100;
     
        var cptEcheancier = parseInt(idInput) + 1;
        if(isChecked) {
          document.getElementById("totalAPayer").value = montantTotal + montant;
          toggleEcheancier(cptEcheancier, false, montantTotal);
        } else {
          var newMontantTotal = montantTotal - montant;
          newMontantTotal = Math.round(parseFloat(newMontantTotal)*100)/100;
     
          document.getElementById("totalAPayer").value = newMontantTotal;
          document.getElementById("totalAPayer").value = parseFloat(document.getElementById("totalAPayer").value);
          document.getElementById("totalAPayer").value = Math.round(document.getElementById("totalAPayer").value*100)/100;
     
          toggleEcheancier(cptEcheancier, true, newMontantTotal);
        }
      }
     
     
      function toggleEcheancier(idInput, isDisabled, montantTotal) {
        if(document.getElementById("echeancier_" + idInput) != null) {
          document.getElementById("echeancier_" + idInput).disabled = isDisabled;
     
          if(isDisabled && document.getElementById("echeancier_" + idInput).checked) {
            document.getElementById("echeancier_" + idInput).checked = false;
     
            var montantCourant = parseFloat(document.getElementById("montant_" + idInput).value);
            montantCourant = Math.round(montantCourant*100)/100;
     
            var newMontantTotal = montantTotal - montantCourant;
            newMontantTotal = Math.round(parseFloat(newMontantTotal)*100)/100;
     
            document.getElementById("totalAPayer").value = newMontantTotal;
            document.getElementById("totalAPayer").value = parseFloat(document.getElementById("totalAPayer").value);
            document.getElementById("totalAPayer").value = Math.round(document.getElementById("totalAPayer").value*100)/100;
     
            var cptEcheancier = parseInt(idInput) + 1;
            toggleEcheancier(cptEcheancier, isDisabled, newMontantTotal);
          }
        }
    Dans mon cas il y a 3 valeur en tout à additionner, chacune valant 53,3. Tout se passe bien jusqu'à la dernière ou je passe de 106,6 à 1959.8999999999

    D'ou cela peut-il venir?
    J'espère être assez clair!

    Merci d'avance

  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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    A quoi ça sert d'attribuer 3 fois une value ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    document.getElementById("totalAPayer").value = newMontantTotal;
          document.getElementById("totalAPayer").value = parseFloat(document.getElementById("totalAPayer").value);
          document.getElementById("totalAPayer").value = Math.round(document.getElementById("totalAPayer").value*100)/100;
    ???
    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
    Membre émérite
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Par défaut
    oui je sais que c'est bien con la!
    mais je cherchais un peu d'ou venais le problème, donc l'écriture passait après...

  4. #4
    Membre émérite
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Par défaut
    J'ai essayé d'utiliser toFixed aussi mais sans résultat

  5. #5
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    tu n'aurais pas un souci de séparateur decimal
    chez moi ça marche très bien
    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 !

  6. #6
    Membre émérite
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Par défaut
    Quand je regarde dans Firebug il additionne bien 53,3 et 106,6 mais la valeur affichée est 159.8999999 au lieu de 159.9

  7. #7
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    oui jusque là c'est normal c'est la gestion de la virgule flottante ...
    c'est justement sur le resultat qu'il faut appliquer le round ...
    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 !

  8. #8
    Membre émérite
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Par défaut
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    function calculerMontantTotal(idInput) {
        var isChecked = document.getElementById("echeancier_" + idInput).checked;
     
        var montantTotal = parseFloat(document.getElementById("totalAPayer").value);
     
        var montant = parseFloat(document.getElementById("montant_" + idInput).value);
     
        var cptEcheancier = parseInt(idInput) + 1;
        if(isChecked) {
          document.getElementById("totalAPayer").value = montantTotal + montant;
          toggleEcheancier(cptEcheancier, false, montantTotal);
        } else {
          var newMontantTotal = new Number(montantTotal - montant);
          newMontantTotal = Math.round(newMontantTotal*100)/100;
     
          document.getElementById("totalAPayer").value = newMontantTotal;
     
          toggleEcheancier(cptEcheancier, true, newMontantTotal);
        }
      }
     
    function toggleEcheancier(idInput, isDisabled, montantTotal) {
        if(document.getElementById("echeancier_" + idInput) != null) {
          document.getElementById("echeancier_" + idInput).disabled = isDisabled;
     
          if(isDisabled && document.getElementById("echeancier_" + idInput).checked) {
            document.getElementById("echeancier_" + idInput).checked = false;
     
            var montantCourant = parseFloat(document.getElementById("montant_" + idInput).value);
     
            var newMontantTotal = new Number(montantTotal - montantCourant);
            newMontantTotal = Math.round(newMontantTotal*100)/100;
     
            document.getElementById("totalAPayer").value = newMontantTotal;
     
            var cptEcheancier = parseInt(idInput) + 1;
            toggleEcheancier(cptEcheancier, isDisabled, newMontantTotal);
          }
        }
      }
    Ne marche pas non plus....

  9. #9
    Membre émérite
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Par défaut
    c'est bon ça marche, je suis c** je ne faisais pas le round au bon endroit. mais ce que je ne comprend pas c'est qu'en additionnant 53,3 et 106,6 il trouve 159,899999 et qu'un round est nécessaire!

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
      function calculerMontantTotal(idInput) {
        var isChecked = document.getElementById("echeancier_" + idInput).checked;
     
        var montantTotal = parseFloat(document.getElementById("totalAPayer").value);
     
        var montant = parseFloat(document.getElementById("montant_" + idInput).value);
     
        var cptEcheancier = parseInt(idInput) + 1;
        var newMontantTotal;
        if(isChecked) {
          newMontantTotal = montantTotal + montant;	
          newMontantTotal = Math.round(newMontantTotal*100)/100;
          document.getElementById("totalAPayer").value = newMontantTotal;
     
          toggleEcheancier(cptEcheancier, false, montantTotal);
        } else {
          newMontantTotal = new Number(montantTotal - montant);
          newMontantTotal = Math.round(newMontantTotal*100)/100;
     
          document.getElementById("totalAPayer").value = newMontantTotal;
     
          toggleEcheancier(cptEcheancier, true, newMontantTotal);
        }
      }
     
     
      function toggleEcheancier(idInput, isDisabled, montantTotal) {
        if(document.getElementById("echeancier_" + idInput) != null) {
          document.getElementById("echeancier_" + idInput).disabled = isDisabled;
     
          if(isDisabled && document.getElementById("echeancier_" + idInput).checked) {
            document.getElementById("echeancier_" + idInput).checked = false;
     
            var montantCourant = parseFloat(document.getElementById("montant_" + idInput).value);
     
            var newMontantTotal = montantTotal - montantCourant;
            newMontantTotal = Math.round(newMontantTotal*100)/100;
     
            document.getElementById("totalAPayer").value = newMontantTotal;
     
            var cptEcheancier = parseInt(idInput) + 1;
            toggleEcheancier(cptEcheancier, isDisabled, newMontantTotal);
          }
        }
      }
    Merci de ton aide en tout cas SpaceFrog!

  10. #10
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <script type="text/javascript">
    function calculerMontantTotal(idInput) {
        var isChecked = document.getElementById("echeancier_" + idInput).checked;
     
        var montantTotal = +document.getElementById("totalAPayer").value;
     
        var montant = +document.getElementById("montant_" + idInput).value;
     
        var cptEcheancier = parseInt(idInput,10) + 1;
        if(isChecked) {
          document.getElementById("totalAPayer").value = Math.round((montantTotal + montant)*100)/100;
          toggleEcheancier(cptEcheancier, false, Math.round((montantTotal)*100)/100);
        } else {
          var newMontantTotal = Math.round((montantTotal - montant)*100)/100;
     
          document.getElementById("totalAPayer").value = newMontantTotal;
     
          toggleEcheancier(cptEcheancier, true, newMontantTotal);
        }
      }
     
    function toggleEcheancier(idInput, isDisabled, montantTotal) {
        if(document.getElementById("echeancier_" + idInput) != null) {
          document.getElementById("echeancier_" + idInput).disabled = isDisabled;
     
          if(isDisabled && document.getElementById("echeancier_" + idInput).checked) {
            document.getElementById("echeancier_" + idInput).checked = false;
     
            var montantCourant = +document.getElementById("montant_" + idInput).value;
     
            var newMontantTotal = newMontantTotal = Math.round(newMontantTotal*100)/100;        
     
            document.getElementById("totalAPayer").value = newMontantTotal;
     
            var cptEcheancier = parseInt(idInput,10) + 1;
            toggleEcheancier(cptEcheancier, isDisabled, newMontantTotal);
          }
        }
      }
     
    </script>
    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 !

  11. #11
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par michel.di Voir le message
    ce que je ne comprend pas c'est qu'en additionnant 53,3 et 106,6 il trouve 159,899999 et qu'un round est nécessaire!
    Citation Envoyé par SpaceFrog Voir le message
    c'est la gestion de la virgule flottante ...
    [ame]http://fr.wikipedia.org/wiki/Virgule_flottante[/ame]
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  12. #12
    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 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    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 659
    Billets dans le blog
    1
    Par défaut
    ce n'est pas un phénomène spécifique à javascript ...
    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 !

  13. #13
    Membre émérite
    Avatar de michel.di
    Homme Profil pro
    Freelance
    Inscrit en
    Juin 2009
    Messages
    782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 782
    Par défaut
    Merci beaucoup pour vos précisions je m'endormirai moins bête!
    je marque comme résolu

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

Discussions similaires

  1. [Maths] Un génie qui ne communique pas :)
    Par KiLVaiDeN dans le forum La taverne du Club : Humour et divers
    Réponses: 20
    Dernier message: 25/08/2006, 21h24
  2. LIKE de tout ce qui n'est pas compris entre a<-&
    Par DjinnS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/07/2003, 13h09
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. [VB6] générer un recordset qui n'est pas lier à un bdd
    Par damyrid dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/06/2003, 17h48
  5. Réponses: 9
    Dernier message: 07/05/2003, 12h57

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