web-dev-qa-db-fra.com

Comparaison des flotteurs Javascript

J'ai un gros problème avec la comparaison des nombres en javascript.

Le script accuse la comparaison "7 <10" de fausse.

console.clear();

var min = parseFloat("5").toFixed(2);
var max = parseFloat("10").toFixed(2);
var value = parseFloat("7").toFixed(2);

console.log(min, max, value);

console.log(value > min); // OK.
console.log(value < max); // ---- false ??????

Quelqu'un sait ce qui se passe?

23
Alexandre Perez

Comme il s'avère que .toFixed () renvoie des chaînes - Essayez d'ajouter parseFloat avant de comparer les valeurs pour voir le résultat:

console.log(parseFloat(value) < parseFloat(max)); // ---- now true
40
prototype

Vous devriez toujours arrondir les nombres flottants ou vous obtiendrez des résultats étranges dans certains cas.

Essayez ceci pour voir le problème: console.log(parseFloat(6760/100*100));

Avec l'arrondi, vous obtiendrez des résultats corrects:

console.log(Math.round(parseFloat(value)*100000) < Math.round(parseFloat(max)*100000));

Ou vous pouvez essayer d'utiliser quelque chose comme: http://mikemcl.github.io/decimal.js/

Les nombres à virgule flottante ne sont pas des nombres précis, ils sont une représentation proche des nombres.

C'est en fait assez simple. Lorsque vous avez un système de base 10 (comme le nôtre), il ne peut exprimer que des fractions qui utilisent un facteur premier de la base. Les facteurs premiers de 10 sont 2 et 5. Ainsi, 1/2, 1/4, 1/5, 1/8 et 1/10 peuvent tous être exprimés proprement car les dénominateurs utilisent tous des facteurs premiers de 10. En revanche, 1/3, 1/6 et 1/7 sont tous des décimales répétitives car leurs dénominateurs utilisent un facteur premier de 3 ou 7. En binaire (ou base 2), le seul facteur premier est 2. Ainsi, vous ne pouvez exprimer que proprement des fractions qui ne contient que 2 comme facteur premier. En binaire, 1/2, 1/4, 1/8 seraient tous exprimés proprement en décimales. Alors que 1/5 ou 1/10 répéteraient des décimales. Donc, 0,1 et 0,2 (1/10 et 1/5), tout en décimales propres dans un système de base 10, sont des décimales répétitives dans le système de base 2 dans lequel l'ordinateur fonctionne. Lorsque vous faites le calcul sur ces décimales répétitives, vous vous retrouvez avec les restes qui se répercutent lorsque vous convertissez le nombre de base 2 (binaire) de l'ordinateur en un nombre de base 10 plus lisible par l'homme. Source


C'est pas le problème de JavaScript . Cela se produit parce que l'ordinateur ne comprend vraiment que 1 et 0.

Si vous souhaitez approfondir le sujet, je suggère cela comme point de départ: https://docs.Oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

6
Lukas Liesis