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 du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 100
    Points : 48
    Points
    48
    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
    Nouveau membre du Club
    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
    Points : 30
    Points
    30
    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
    Points : 91 220
    Points
    91 220
    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

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

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    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 émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    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 éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    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 du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 100
    Points : 48
    Points
    48
    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 640
    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 640
    Points : 66 665
    Points
    66 665
    Billets dans le blog
    1

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 100
    Points : 48
    Points
    48
    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