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 :

La multiplication de 40.87 et 40.88 par 100 ne fonctionne pas !


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 23
    Points
    23
    Par défaut La multiplication de 40.87 et 40.88 par 100 ne fonctionne pas !
    Bonjour à tous amis développeurs,

    Je vous soumets un problème étrange rencontré ce jour sur un petit programme de calcul de prix.
    Dans mon code, il existe une fonction qui multiplie le prix unitaire par la quantité et qui multiplie le tout par 100 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var total = pu * qty * 100
    Or lorsque le prix unitaire est exactement 14.87 ou 14.88, le calculateur perd totalement les pédales, il ajoute des arrondis délirants.

    Du coup j'ai voulu circonscrire le problème et je suis arrivé à la constatation que le problème venait vraisemblablement de Javascript lui-même (le coquin !)
    Je vous invite à tester le bout de code suivant dans n'importe quel navigateur le rendu est le même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    console.log('40.86 x 100 = ' + 40.86 * 100);
    console.log('40.87 x 100 = ' + 40.87 * 100);
    console.log('40.88 x 100 = ' + 40.88 * 100);
    console.log('40.89 x 100 = ' + 40.89 * 100);
    Chez moi, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    40.86 x 100 = 4086
    40.87 x 100 = 4086.9999999999995
    40.88 x 100 = 4088.0000000000004
    40.89 x 100 = 4089
    Quelqu'un a-t-il déjà rencontré ce type de problèmes ? Est-ce un défaut de l'interpréteur ou du langage en lui-même ?
    Y a-t-il un moyen de "résoudre" ça ?

    Merci à tous

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 939
    Points : 44 120
    Points
    44 120
    Par défaut
    Bonjour,
    (...)le problème venait vraisemblablement de Javascript lui-même (le coquin !)
    la précision des nombres en virgule flottante n'est pas liée au langage, regarde cette discussion sur le forum Chiffres après la virgule.

    Je te remets le lien qu'a signalé Auteur http://fr.wikipedia.org/wiki/Virgule_flottante.

  3. #3
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    C'est un cas classique lié au fonctionnement de la virgule flottante. Ca me fait penser qu'il faudrait écrire une entrée dans la FAQ à ce sujet, puisqu'il revient souvent.

    Les décimales à rallonge ne sont pas un problème en soi, il faudra juste penser à arrondir à la sortie ou afficher avec un nombre fixe de décimales avec nombre.toFixed(nbDecimales)
    One Web to rule them all

  4. #4
    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 : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Quelqu'un a-t-il déjà rencontré ce type de problèmes ?
    Tout le monde normalement !

    Voir aussi : http://floating-point-gui.de/.
    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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Heureusement que les calculatrices ne sont pas codées en JS...
    Résolu avec toFixed()
    Merci pour vos réponses.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/07/2011, 16h08
  2. Select multiple ne fonctionne pas
    Par Godard dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/09/2010, 08h41
  3. [Batch] Choix multiple ne fonctionne pas
    Par FCL31 dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 10/05/2010, 16h38
  4. Réponses: 0
    Dernier message: 24/08/2009, 11h00
  5. Clause Distinct ne fonctionne pas su SELECT multiple
    Par fabou3377 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/08/2006, 12h39

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