This output should be true.but it give false always.
Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))
asked Mar 22, 2016 at 6:58
6
Floating point arithmetic in Javascript is broken and in general as well.
It has nothing to do with division, it will return false if you don’t do division since you are checking float value.
Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))
translates to Number.isInteger(13496582.999999998)
-> false
Check these examples.
Number.isInteger(parseFloat('134965.83') )// outputs false without division
As per the spec
If Type(argument) is not Number, return false.
If floor(abs(argument)) ≠ abs(argument), return false.
answered Mar 22, 2016 at 7:05
gurvinder372gurvinder372
67k10 gold badges72 silver badges94 bronze badges
6
This happens because the outcome of the division is not an integer but something like 13496582.999999998
.
Some floating numbers require a very small precision that is limited by the data type used. For example, the number 1/3
can never be expressed entirely as 0.333333333333
because there is a limitation to the data type size. Therefore there will always be a tiny rounding error involved in floating operations.
Edit: In response to the comment asking for a recommendation on how to deal eith this, actually there are several possibilities. It depends on the context and on accuracy required.
In short, to overcome this use a very small constant Number.EPSILON (see also this) and use it in comparisons. Disclaimer: this is just a quick example, read extensively the implications on the links provided.
var myIsInteger = function(n) {
return (n % 1) > Number.EPSILON
};
We effectively check that the residual of the division with 1 is within the constant.
answered Mar 22, 2016 at 7:08
WtowerWtower
18.9k11 gold badges104 silver badges80 bronze badges
8
parseFloat(‘134965.83’) / parseFloat(‘0.01’) = 13496582.999999998
And when Number.isInteger(13496582.999999998) will always return false
answered Mar 22, 2016 at 7:07
Coder JohnCoder John
7864 silver badges7 bronze badges
Здравствуйте друзья!
Делаю себе калькулятор подсчета чувствительности к инсулину.
500 делю на суточную дозу инсулина 28 = 17,86
17,86 делю на 12 и должен получить 1,49 (с округлением) а получаю 1,42
Подскажите пожалуйста, что не так??
Вот скрипт
$(function() {
$('input').keyup(function(){
updateTotal();
});
var updateTotal = function () {
var input2 = parseInt($('#tab_id2').val()) || null;
var total = (500 / input2).toFixed(2);
if (input2) {
$('#total_id_1').val(total);
};
var input1 = parseInt($('#total_id_1').val()) || null;
var total = (input1 / 12).toFixed(2);
if (input1) {
$('#total_id_2').val(total);
}
}
});
500÷<input type="number" id="tab_id2" />=
<input type="number" id="total_id_1"/>гр. <br>
<input type="number" id="total_id_2" />ХЕ
И еще такой вопрос, можно ли сделать так, чтобы при удалении значения с input все остальные значения удалялись?
Заранее большое спасибо!
Это происходит потому, что результат деления не является целым числом, а чем-то вроде 13496582.999999998
.
Некоторые плавающие числа требуют очень малой точности, которая ограничена используемым типом данных. Например, число 1/3
никогда не может быть выражено целиком как 0.333333333333
потому что существует ограничение на размер типа данных. Поэтому в плавающих операциях всегда будет крошечная ошибка округления.
Изменение: В ответ на комментарий, в котором содержится рекомендация о том, как справиться с этим, на самом деле существует несколько возможностей. Это зависит от контекста и требуемой точности.
Короче говоря, для преодоления этого используйте очень малую константу Number.EPSILON (см. Также это) и используйте ее в сравнении. Отказ от ответственности: это всего лишь быстрый пример, широко изучающий последствия для предоставленных ссылок.
var myIsInteger = function(n) {
return (n % 1) > Number.EPSILON
};
Мы эффективно проверяем, что остаточная деление с 1 находится в пределах константы.
Js какая арифметическая операция приведёт к ошибке
JavaScript — это язык программирования, который обрабатывает множество операций, включая арифметические операции. Однако есть определенные условия, при которых выполнение арифметической операции может привести к ошибке.
Деление на ноль
В JavaScript деление на ноль не вызывает ошибку, как это может быть в некоторых других языках программирования. Вместо этого результатом будет бесконечность (Infinity), если делитель положительный, или минус бесконечность (-Infinity), если делитель отрицательный.
console.log(1 / 0); // Infinity
console.log(-1 / 0); // -Infinity
Операция с NaN
Несмотря на то, что операция с NaN (Not a Number) не вызывает ошибку, она возвращает NaN. Это может привести к непредсказуемым результатам в вашем коде.
console.log(1 * NaN); // NaN
Переполнение
JavaScript может обрабатывать очень большие числа, но есть предел. Если результат арифметической операции превышает максимальное безопасное целое число в JavaScript (9007199254740991), это может привести к непредсказуемым результатам, хотя и не вызывает ошибку напрямую.
console.log(9007199254740991 + 1); // 9007199254740992 - всё ещё точно
console.log(9007199254740991 + 2); // 9007199254740992 - уже неточно!
Это происходит потому, что результатом деления является не целое число, а что-то вроде 13496582.999999998
,
Некоторые плавающие числа требуют очень малой точности, которая ограничена используемым типом данных. Например, число 1/3
никогда не может быть выражено полностью как 0.333333333333
потому что есть ограничение на размер типа данных. Поэтому в плавающих операциях всегда будет крошечная ошибка округления.
Изменить: В ответ на комментарий с просьбой дать рекомендацию о том, как с этим справиться, на самом деле есть несколько возможностей. Это зависит от контекста и требуемой точности.
Короче говоря, чтобы преодолеть это, используйте очень маленькую константу Number.EPSILON ( см. Также это) и используйте ее в сравнениях. Отказ от ответственности: это только краткий пример, внимательно прочитайте последствия для предоставленных ссылок.
var myIsInteger = function(n) {
return (n % 1) > Number.EPSILON
};
Мы эффективно проверяем, что остаток от деления с 1 находится в пределах константы.