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 :

Conversion nombre entier incorrecte avec parseInt


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 100
    Par défaut Conversion nombre entier incorrecte avec parseInt
    Bonjour à tous,

    j'aimerais comprendre pourquoi le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(parseInt(5.02*100));
    donne comme résultat 501 au lieux de 502 ??

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 63
    Par défaut
    bonjour,

    c'est le parseInt qui cause souci.
    Pour 5.10*100 avec cette fonction ça fait 509.

    donne 509.9999999999994

  3. #3
    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


    parseInt() et parseFloat() n'y sont pour rien, c'est la représentation des numériques dans la plupart des langages qui sont en cause !
    The Floating-Point Guide - What Every Programmer Should Know About Floating-Point Arithmetic
    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

  4. #4
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par zouetchou Voir le message
    Bonjour à tous,

    j'aimerais comprendre pourquoi le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(parseInt(5.02*100));
    donne comme résultat 501 au lieux de 502 ??

    Merci
    Je trouve la méthode quelque peut capilotractée.

    5.02*100 donne un float
    parseInt prends en paramètre une String.
    l'interprète va donc faire une toString sur le float avant le le passer à parseInt
    celui-ci va tenter de convertire la String en entier
    on a donc un code pour loin moins étrange.
    ça revient à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(parseInt((5.02*100).toString()));
    alors qu'il semble que tu cherche à convertir un float en int

    fait des calcul avec les nombre me parais bien plus naturel que d'abuser des Cast et parse en tout genre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(Math.round(5.02*100));
    et tout de même une méthode bien plus simple.

    quitte à passer par un String il suffisait de retirer le .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert((5.02).toString().replace('.', ''));
    Mais on a alors une String et non un Int

    A+JYT

  5. #5
    Invité
    Invité(e)
    Par défaut
    ou pourquoi pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(Math.round(parseFloat(5.02*100)));

  6. #6
    Membre Expert
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Par défaut
    Salut,

    Il y a une fonction intéressante ici JavaScript Rounding Errors.

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function Round(Number, DecimalPlaces) {
    	return Math.round(parseFloat(Number) * Math.pow(10, DecimalPlaces)) / Math.pow(10, DecimalPlaces);
    }
     
    var n=5.02*100;		// 501.99999999999994
    alert( Round(n,2) );	// 502

  7. #7
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    Citation Envoyé par mekal Voir le message
    ou pourquoi pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alert(Math.round(parseFloat(5.02*100)));
    Mais c'est une manie les fonctions de parsing sont destinées à "lire" dans une chaine de caractères

    Le produit 5.01 * 100 est une objet de type float.

    pourquoi vouloir le transformer en chaine de caractère pour le passer à un e fonction qui en refera un float ?

    ECMAScript est un langage typé. ce n'est pas parce-qu'il offre des facilité de convertion de type qu'il faut en faire n'importe quoi.

    en java par exemple il ne vous viendrait pas à l'idée de faire
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Float number =5.02;
    number = number * 100;
    String stringNumber = number.toString();
    Float result = Float. parseFloat(stringNumber);

    ça ne sert à rien et ça risque d'altérer le nombre.

    Donc encore une fois javascript est un langage typé chaque objet à un type à un instant T et il est tpujours plus couteux d'en changer que de l'utiliser.

    Attention changer le type d'un objet Javascript n'est pas un CAST à la C ou C++
    lorsqu'un objet est du type A en C A obj = new A (); et qu'on fait (B)obj; l'objet obj pointe sur une zone mémoire qui contient les données de l'objet l'opération de CAST indique au compilateur qu'il doit dans la suite utiliser les propiété de la classe B pour acceder à cet objet. l'objet lui-même n'est pas modifié.

    en javascript à chaque fois que l'interprète détecte la nécécité d'un changement de type il modifie en mémoire l'objet pour qu'il corresponde au résultat attendu.

    il convient donc de ne pas en abuser.
    A+JYT

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 100
    Par défaut
    Oula ! Moi je veux juste que mon nombre décimal 5.02 soit égal 502 lorsqu'on le multiplie par 100 et non à 501.9999....4 !

    Merci

  9. #9
    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 658
    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 658
    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 !

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 100
    Par défaut
    Impec, merci !

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

Discussions similaires

  1. conversion nombre en texte avec Format
    Par LaPanic dans le forum VBScript
    Réponses: 2
    Dernier message: 28/04/2010, 01h16
  2. Conversion de nombre décimaux en nombre entier
    Par noahline dans le forum VBScript
    Réponses: 2
    Dernier message: 05/12/2008, 12h47
  3. Réponses: 2
    Dernier message: 10/09/2007, 19h43
  4. [VB5]Conversion d'octets en nombres entiers
    Par KardiakKris dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/03/2006, 17h15
  5. Conversion incorrecte avec atof ou strtod
    Par sber74 dans le forum C
    Réponses: 16
    Dernier message: 15/03/2006, 20h32

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