Précédent   Forum du club des développeurs et IT Pro > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/12/2012, 15h16   #1
zouetchou
Candidat au titre de Membre du Club
 
Inscription : juillet 2004
Messages : 53
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 53
Points : 10
Points : 10
Par défaut Conversion nombre entier incorrecte avec parseInt

Bonjour à tous,

j'aimerais comprendre pourquoi le code
Code :
alert(parseInt(5.02*100));
donne comme résultat 501 au lieux de 502 ??

Merci
zouetchou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 15h59   #2
armoirapizza
Candidat au titre de Membre du Club
 
Homme
Inscription : mars 2011
Messages : 56
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mars 2011
Messages : 56
Points : 12
Points : 12
bonjour,

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

donne 509.9999999999994
armoirapizza est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/12/2012, 17h53   #3
Bovino
Responsable Développement Web

 
Avatar de Bovino
 
Homme Didier Mouronval
Développeur Web
Inscription : juin 2008
Messages : 18 565
Détails du profil
Informations personnelles :
Nom : Homme Didier Mouronval
Âge : 42
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : juin 2008
Messages : 18 565
Points : 66 564
Points : 66 564


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 !
Vous possédez un blog et aimeriez diffuser vos billets sur le forum, 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
Bovino est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/12/2012, 21h24   #4
sekaijin
Expert Confirmé Sénior
 
Avatar de sekaijin
 
Homme
Urbaniste
Inscription : juillet 2004
Messages : 2 171
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 49
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 2 171
Points : 5 162
Points : 5 162
Citation:
Envoyé par zouetchou Voir le message
Bonjour à tous,

j'aimerais comprendre pourquoi le code
Code :
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 :
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 :
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 :
alert((5.02).toString().replace('.', ''));
Mais on a alors une String et non un Int

A+JYT
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 28/12/2012, 21h34   #5
mekal
Membre chevronné
 
Homme Krusty
Inscription : mai 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Homme Krusty
Localisation : France

Informations forums :
Inscription : mai 2009
Messages : 525
Points : 763
Points : 763
ou pourquoi pas

Code :
alert(Math.round(parseFloat(5.02*100)));
__________________
programmer n'est pas connaitre tous les moindres détails d'un langage mais savoir exploiter sous toutes ses facettes ce que l'on connait.
mekal est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/12/2012, 23h31   #6
Eric2a
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 42

Informations forums :
Inscription : septembre 2005
Messages : 1 094
Points : 1 717
Points : 1 717
Salut,

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

Code js :
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
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 11h38   #7
sekaijin
Expert Confirmé Sénior
 
Avatar de sekaijin
 
Homme
Urbaniste
Inscription : juillet 2004
Messages : 2 171
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 49
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 2 171
Points : 5 162
Points : 5 162
Citation:
Envoyé par mekal Voir le message
ou pourquoi pas

Code :
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 :
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 16h51   #8
zouetchou
Candidat au titre de Membre du Club
 
Inscription : juillet 2004
Messages : 53
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 53
Points : 10
Points : 10
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
zouetchou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 17h20   #9
SpaceFrog
Rédacteur/Modérateur

 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 32 980
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 32 980
Points : 51 739
Points : 51 739
__________________
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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
Humour
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 18h50   #10
zouetchou
Candidat au titre de Membre du Club
 
Inscription : juillet 2004
Messages : 53
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 53
Points : 10
Points : 10
Impec, merci !
zouetchou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h26.


 
 
 
 
Partenaires

Hébergement Web