Подтвердить что ты не робот

Javascript: сравнение двух значений float

У меня есть эта функция 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
}

Когда я сравниваю числа с плавающей запятой av=7.00 и cv=12.00, результат 7.00<12.00 равен false!

Любые идеи, почему?

4b9b3361

Ответ 1

toFixed возвращает строку, и вы сравниваете две полученные строки. Лексически, 1 из 12 предшествует 7, поэтому 12 < 7.

Я думаю, вы хотите сравнить что-то вроде:

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

который округляется до двух десятичных знаков

Ответ 2

Сравните числа с плавающей точкой с точностью:

var precision = 0.001;

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

UPD: Или, если одно из чисел является точным, сравните точность с относительной ошибкой

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

return (relativeError <= precision);

Ответ 3

Сравнение поплавков с использованием короткой нотации, также принимает float как строки и целые числа:

var floatOne = 2, floatTwo = '1.456';

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

(!) Примечание: Сравнение происходит с использованием целых чисел. Что на самом деле происходит за кулисами: 200 > 145

Расширение 100 с нулем для более десятичной точности. Например, используйте 1000 с точностью до 3 десятичных знака.

Тест:

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

Ответ 4

Функция Math.fround() возвращает ближайшее 32-битное представление числа с плавающей запятой одинарной точности.

И поэтому является одним из лучших вариантов для сравнения 2 поплавков.

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