Maison >interface Web >js tutoriel >Analyse et solution du problème de précision des opérations en virgule flottante Javascript_Compétences Javascript

Analyse et solution du problème de précision des opérations en virgule flottante Javascript_Compétences Javascript

WBOY
WBOYoriginal
2016-05-16 16:54:221257parcourir

Analyse

JavaScript n'a qu'un seul type de nombre, Number , et tous les nombres en Javascript sont représentés au format standard IEEE-754. Le problème de précision des nombres à virgule flottante n'est pas spécifique à JavaScript, car certaines décimales ont des chiffres infinis lorsqu'elles sont représentées en binaire :

Système décimal 0,0100 1100 1100 1100 ...
0,4 0,0110 0110 0110 0110 ...
0,5 0,1
0,6 0,1001 1001 1001 1001 ...

Par exemple, 1.1, le programme ne peut pas réellement représenter « 1.1 », mais ne peut atteindre qu'un certain degré de précision. Il s'agit d'une perte de précision inévitable :

1.099999999999999999

Le problème est plus compliqué en JavaScript. Voici quelques données de test dans Chrome :

Entrée

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

Solution

Alors comment éviter ce type de problèmes non bugs 1.0-0.9 != 0.1 ? Ce qui suit est une solution couramment utilisée. Le résultat du calcul est réduit en précision avant de juger le résultat de l'opération en virgule flottante, car le processus de réduction de précision sera toujours automatiquement arrondi :


Copier code Le code est le suivant :(1.0-0.9).toFixed(digits)                                                                                                                                                                                 Entre<.>parseFloat((1.0-0.9).toFixed( 10)) === 0,1 // Le résultat est True
parseFloat((1.0-0.8).toFixed(10)) === 0.2 // Le résultat est True
parseFloat((1.0-0.7). toFixed(10)) === 0.3 // Le résultat est True
parseFloat((11.0-11.8).toFixed(10)) === -0.8 // Le résultat Affinage de la méthode pour True






Copiez le code
Le code est le suivant :// Déterminer si les valeurs sont égales grâce à la méthode de l'outil isEqualfunction isEqual(number1, number2, digits){
digits = digits == undefined ? // La précision par défaut est 10
return number1 ? . toFixed(digits) === number2.toFixed(digits);
>

isEqual(1.0-0.7, 0.3); // renvoie vrai

// Méthode d'extension native, préférez le style orienté objet Number.prototype.isEqual = function(number, digits){

digits = digits == undefined 10: digits; 10

return this.toFixed(digits) === number.toFixed(digits);

>

(1.0-0.7).isEqual(0.3); // renvoie vrai

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn