11540 sujets

JavaScript, DOM et API Web HTML5

Salut,

j'ai un soucis avec des nombres à virgules.

recherchesTotal += value.recherche;

imaginons que l'on a cela à la place

0 += 1.2

le tout dans une boucle à trois itération
et ben cela ma me sortir 1.21.21.2 et non le chiffre convenu via un vrai calcule. là il concatène.. je comprend pas du coup.

Merci
Probablement parce que tu manipules des chaînes et pas des nombres.

Je ne sais pas quel langage tu utilises mais vérifie bien le type de données manipulées, parce qu’effectivement ton exemple ne fait que concaténer deux chaînes de caractères Smiley ohwell .
Salut, merci à toi

C'est en JavaScript, j'ai essayer parseInt mais cela ne garde pas le nombre après la virgules...

Du coup j'ai utiliser parseFloat() et cela à l'air de bien fonctionné comme je le souhaite.
Modifié par JENCAL (01 Jun 2015 - 15:27)
Par contre, pour garder deux decimal après la virgule comment cela est possible ?

parce que j'ai ça

recherchesTotal += value.recherche


en gros

0.13215621 += 0.23156 // chiffre bidon


j'ai beau tout essayer ça fait nimporte quoi

un parsFloat(), un .round(2), un parsFloat() avec un .toFixed(2).. rien n'y fait..

le résultat et encore plus fou

050037.40382172.84
Modifié par JENCAL (01 Jun 2015 - 17:43)
effectivement, je vais tester cette fonction qui m'a l'air pas mal du tout

function roundToTwo(num) {    
    return +(Math.round(num + "e+2")  + "e-2");
}
alors malheureusement non..

je dois dire que cela marche une fois sur deux

voici le résultat

9538.33     -  	  10954.300000000001      -    	14419.11      -    	11018.99      -    	9189.400000000001


9538.33 là c'est niquel
10954.300000000001 là je sais pas pourquoi...
Modifié par JENCAL (03 Jun 2015 - 17:56)
salut,
tu dois juste mal le faire parce qu'un toFixed() marche bien. Tu peux aussi passer par toPrecision(). Voir un exemple.

Le truc qu'il faut garder en tête c'est que les nombres en JS (et d'autres langages d'ailleurs) sont assez particuliers. Les calculs se font en binaire selon une norme de représentation (pour le JS c'est IEEE 754 en 64 bits où c'est l'unique format d'ailleurs) et il y a donc conversion du format source en binaire, puis après calcul, reconversion vers le format d'origine.
La représentation des nombres flottants est donc difficile et limitée, d'où les résultats assez aléatoires que tu obtiens.
Un truc connu en JS :

0.1 + 0.2 === 0.3 // False
Hello Zelalsan, merci de ta réponse très précise ça m'éclair bien!

par contre c'est curieux, je suis quasiment sur de faire correctement le .toFixed, car normalement TOUT les nombres ont plus de deux chiffres après la virgule...... donc c'est bizarre. je continu de travaillé dessus.
upload/56013-Capture2.PNG
on voit bien que malgré le .fixed le nombre contient plus de deux chiffres
Modifié par JENCAL (04 Jun 2015 - 17:20)
C'est parce que

total: recherchesTotal.toFixed(2)

fera que ça sera "total" qui aura la bonne valeur. Si tu veux que "recherchesTotal" ait la bonne valeur, il faudra la modifier :

recherchesTotal = recherchesTotal.toFixed(2);
oui

Sauf que ni l'un ni l'autre ne contient la bonne valeur avec seulement 2 chiffres après la virgules..

j'ai fais recherchesTotal = recherchesTotal.toFixed(2); AVANT d'assigner a total... mais c'est pareil.

je pleure.
Ok j'ai enfin réussi !

je me suis fait une petite fonction qui prend en argument un array, qui boucle sur ses occurences, et qui applique un .toFixed2. cette fonction est déclenché AVANT d'assigner à total... merci a tous.