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

Есть идеи, почему?

30
Harold Sota 27 Июл 2010 в 16:33

4 ответа

Лучший ответ

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

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

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

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

37
thomaux 20 Дек 2011 в 16:14

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

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);
11
Edward 14 Мар 2018 в 17:45

Функция 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
2
George C. 12 Апр 2019 в 15:09

Сравнение чисел с плавающей запятой с использованием коротких обозначений также допускает использование чисел с плавающей точкой в виде строк и целых чисел:

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));
3
Alph.Dev 20 Окт 2017 в 22:26