Maison > interface Web > js tutoriel > 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

零下一度
Libérer: 2017-06-30 10:18:09
original
1423 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

<br>
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal