web-dev-qa-db-fra.com

Javascript: comparaison de deux valeurs flottantes

J'ai cette fonction JavaScript:

Contrl.prototype.EvaluateStatement = function(acVal, cfVal) {

    var cv = parseFloat(cfVal).toFixed(2);
    var av = parseFloat(acVal).toFixed(2);

   if( av < cv) // do some thing
}

Quand je compare les nombres flottants av=7.00 et cv=12.00 Le résultat de 7.00<12.00 est false!

Des idées pourquoi?

28
Harold Sota

toFixed renvoie une chaîne et vous comparez les deux chaînes résultantes. Lexique, le 1 sur 12 précède le 7 donc 12 <7.

Je suppose que vous voulez comparer quelque chose comme:

(Math.round(parseFloat(acVal)*100)/100)

qui arrondit à deux décimales

36
second

Comparez les nombres flottants avec précision:

var precision = 0.001;

if (Math.abs(n1 - n2) <= precision) {
  // equal
}
else {
  // not equal
}

UPD: Ou, si l'un des nombres est précis, comparez la précision avec l'erreur relative

var absoluteError = (Math.abs(nApprox - nExact)),
  relativeError = absoluteError / nExact;

return (relativeError <= precision);
10
Edward

La fonction Math.fround () renvoie la représentation flottante simple précision 32 bits la plus proche d'un nombre.

Et c'est donc l'un des meilleurs choix pour comparer 2 flotteurs.

if (Math.fround(1.5) < Math.fround(1.6)) {
    console.log('yes')
} else {
    console.log('no')
}

>>> yes

// More examples:
console.log(Math.fround(0.9) < Math.fround(1));                            >>> true
console.log(Math.fround(1.5) < Math.fround(1.6));                          >>> true
console.log(Math.fround(0.005) < Math.fround(0.00006));                    >>> false
console.log(Math.fround(0.00000000009) < Math.fround(0.0000000000000009)); >>> false
2
George C.

La comparaison des flottants à l'aide d'une notation courte accepte également les flottants sous forme de chaînes et d'entiers:

var floatOne = 2, floatTwo = '1.456';

Math.floor(floatOne*100) > Math.floor(floatTwo*100) 

(!) Remarque: la comparaison se fait à l'aide d'entiers. Ce qui se passe réellement dans les coulisses: 200 > 145

Prolongez 100 avec zéro pour plus de précision décimale. Par exemple, utilisez 1000 pour une précision de 3 décimales.

Test:

var floatOne = 2, floatTwo = '1.456';
console.log(Math.floor(floatOne*100), '>', Math.floor(floatTwo*100), '=', Math.floor(floatOne*100) > Math.floor(floatTwo*100));
2
Alph.Dev