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?
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
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);
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
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));