У меня есть эта функция 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 ответа
ToFixed возвращает строку, и вы сравниваете две результирующие строки. Лексически, 1 из 12 предшествует 7, поэтому 12 <7.
Я думаю, вы хотите сравнить что-то вроде:
(Math.round(parseFloat(acVal)*100)/100)
Который округляется до двух десятичных
Сравните числа с плавающей точкой с точностью:
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);
Функция 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
Сравнение чисел с плавающей запятой с использованием коротких обозначений также допускает использование чисел с плавающей точкой в виде строк и целых чисел:
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));
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.