Maison  >  Article  >  interface Web  >  Explication détaillée des problèmes de calcul de la virgule flottante js

Explication détaillée des problèmes de calcul de la virgule flottante js

零下一度
零下一度original
2017-06-30 10:18:091331parcourir

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 propre à JavaScript, car certaines décimales ont des chiffres infinis exprimés en binaire :

0.1              0.0001100110011001100110011001100110011001100110011001101
0.2              0.001100110011001100110011001100110011001100110011001101
0.3              0.010011001100110011001100110011001100110011001100110011
0.5              0.1
0.6              0.10011001100110011001100110011001100110011001100110011

Ainsi, par exemple, 1.1 , son programme ne peut pas réellement vraiment Cela signifie '1.1', mais cela ne peut être précis que dans une certaine mesure. Il s'agit d'une perte de précision inévitable :

1.09999999999999999

En JavaScript, le problème est plus compliqué, voici juste Donnez quelques données de test dans Chrome :

 输入               输出1.0-0.9 == 0.1     False1.0-0.8 == 0.2     False1.0-0.7 == 0.3     False1.0-0.6 == 0.4     True1.0-0.5 == 0.5     True1.0-0.4 == 0.6     True1.0-0.3 == 0.7     True1.0-0.2 == 0.8     True1.0-0.1 == 0.9     True

Solution

Comment éviter ce genre de type ` 1.0-0.9 != 0.1 ` sans bug des problèmes dus au drap de laine ? 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 :

(1.0-0.9).toFixed(digits)     // toFixed() 精度参数须在 0 与20 之间(1.0-0.9).toFixed(10)== 0.1   // 结果为True(1.0-0.8).toFixed(10)== 0.2   // 结果为True(1.0-0.7).toFixed(10)== 0.3   // 结果为True(11.0-11.8).toFixed(10) == -0.8   // 结果为TrueparseFloat((1.0-0.9).toFixed(10)) === 0.1   // 结果为TrueparseFloat((1.0-0.8).toFixed(10)) === 0.2   // 结果为TrueparseFloat((1.0-0.7).toFixed(10)) === 0.3   // 结果为TrueparseFloat((11.0-11.8).toFixed(10)) === -0.8   // 结果为True

Méthode Raffinage

// 通过isEqual工具方法判断数值是否相等function isEqual(number1, number2, digits){
    digits = digits || 10; // 默认精度为10return number1.toFixed(digits) === number2.toFixed(digits);
}

isEqual(1.0-0.7, 0.3);  // return true// 原生扩展方式,更喜欢面向对象的风格Number.prototype.isEqual = function(number, digits){
    digits = digits || 10; // 默认精度为10return this.toFixed(digits) === number.toFixed(digits);
}

(1.0-0.7).isEqual(0.3); // return true

<br>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

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