Javascript: сравнение двух значений с плавающей запятой - PullRequest
24 голосов
/ 27 июля 2010

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

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

Ответы [ 4 ]

36 голосов
/ 27 июля 2010

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

Я полагаю, вы хотите сравнить что-то вроде:

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

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

9 голосов
/ 13 марта 2018

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

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);
2 голосов
/ 12 апреля 2019

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

И, следовательно, является одним из лучших вариантов для сравнения двух чисел.

2 голосов
/ 21 октября 2017

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

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