Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mauvais calcul en javascript

Sujet résolu
    19 février 2019 à 2:56:20

    pourquoi le calcul ci-dessous donne-t-il comme résultat

    7.999999999999999 et non 8 comme cela devrait?

    alert(parseInt(87, 10) / 10 - parseInt(87, 10) % 10 / 10) ;

    parseInt(87, 10) / 10 donne 8.7

    parseInt(87, 10) % 10 / 10 donne 0.7

    Merci d'élucider le mystère...

    • Partager sur Facebook
    • Partager sur Twitter
      19 février 2019 à 9:59:34

      Bonjour,

      Javascript utilise la norme arithmétique à virgule flottante IEEE 754 (format Double Précision 64 bits) pour stocker les nombres. Ca entraîne une perte de précision lors de la conversion.

      Pour essayer de t'expliquer la chose, dis-toi qu'on stocke un nombre sous la forme: signe * mantisse * (2^exposant)
      avec 1 bit de signe, 11 bits d'exposant, 52 bits de mantisse. On travaille toujours en binaire en informatique.

      Tu ajoutes à ça le fait que Javascript utilise un typage dynamique et tu te retrouves avec ce genre d'erreur de conversion :

      9999999999999999 === 10000000000000000 
      // return true
      0.1 + 0.2
      // return 0.30000000000000004

      Une des solutions est d'utiliser la méthode toFixed() pour formater ton nombre en notation à point fixe:

      alert((parseInt(87, 10) / 10 - parseInt(87, 10) % 10 / 10).toFixed()) ;


      Je ne suis pas un expert sur ce sujet, donc n'hésitez pas à me corriger ou apporter des précisions.



      • Partager sur Facebook
      • Partager sur Twitter
        19 février 2019 à 20:33:07

        Bonsoir,

        Il y a également une autre manière de faire en utilisant la fonction Math.round.

        console.log(0.1 + 0.2)
        // return 0.30000000000000004
        
        console.log(Math.round((0.1 + 0.2)*10)/10)
        // return 0.3
        
        



        -
        Edité par celtak 19 février 2019 à 20:35:00

        • Partager sur Facebook
        • Partager sur Twitter

        nicelydev.com : site développé avec le framework Symfony 5 et déployé via Docker

          20 février 2019 à 16:01:12

          Merci à vous deux, ça répond à ma question.
          • Partager sur Facebook
          • Partager sur Twitter

          Mauvais calcul en javascript

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown