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
!
Любые идеи, почему?
Ответы
Ответ 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