analyser
JavaScript n'a qu'un seul numéro de type de nombre, et tous les nombres dans JavaScript sont représentés au format standard IEEE-754. Le problème de précision des nombres à virgule flottante n'est pas unique au JavaScript, car certaines décimales représentent des chiffres infinis en binaire:
Décimal
0,1 0,0001 1001 1001 1001 ...
0,2 0,0011 0011 0011 0011 ...
0,3 0,0100 1100 1100 1100 ...
0,4 0,0110 0110 0110 0110 ...
0,5 0,1
0,6 0,1001 1001 1001 1001 ...
Ainsi, par exemple, 1.1, son programme ne peut pas réellement représenter «1,1», mais ne peut atteindre qu'un certain degré de précision.
1.0999999999999999999
Le problème en JavaScript est plus compliqué, voici seulement quelques données de test dans Chrome:
Entrée et sortie
1,0-0,9 == 0,1 faux
1,0-0,8 == 0,2 faux
1,0-0,7 == 0,3 faux
1,0-0,6 == 0,4 VRAI
1,0-0,5 == 0,5 VRAI
1,0-0,4 == 0,6 VRAI
1,0-0,3 == 0,7 VRAI
1.0-0.2 == 0,8 VRAI
1.0-0.1 == 0,9 VRAI
résoudre
Alors, comment éviter ce type de problème de non-boug avec 1,0-0,9! = 0,1? Voici une solution qui est actuellement utilisée plus fréquemment.
La copie de code est la suivante:
(1.0-0.9) .tofixed (chiffres) // tofixed () Les paramètres de précision doivent être compris entre 0 et 20
parsefloat ((1.0-0.9) .tofixed (10)) === 0.1 // Le résultat est vrai
parsefloat ((1.0-0.8) .tofixé (10)) === 0,2 // Le résultat est vrai
parsefloat ((1.0-0.7) .tofixé (10)) === 0,3 // Le résultat est vrai
parsefloat ((11.0-11.8) .tofixed (10)) === -0.8 // Le résultat est vrai
Méthode raffinage
La copie de code est la suivante:
// Utilisez la méthode de l'outil iségal pour déterminer si les valeurs sont égales ou non
Fonction isEqual (Number1, Number2, Digits) {
chiffres = chiffres == UNDEFINED?
return numéro1.tofixed (chiffres) === numéro2.tofixed (chiffres);
}
ISequal (1,0-0,7, 0,3);
// Méthode d'extension native, préférez le style orienté objet
Nombre.prototype.isequal = fonction (nombre, chiffres) {
chiffres = chiffres == UNDEFINED?
return this.tofixed (chiffres) === numéro.tofixed (chiffres);
}
(1.0-0.7) .isequal (0,3);