Ошибка деления JavaScript при использовании оператора деления
Этот вывод должен быть истинным, но всегда давать ложное.
Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))
3 ответа
Арифметика с плавающей точкой в Javascript нарушена и в целом также.
Он не имеет ничего общего с делением, он вернет false, если вы не делите, так как вы проверяете значение с плавающей запятой.
Number.isInteger(parseFloat('134965.83') / parseFloat('0.01'))
переводит на Number.isInteger(13496582.999999998)
-> false
Проверьте эти примеры.
Number.isInteger(parseFloat('134965.83') )// outputs false without division
Согласно спецификации
Если Type(аргумент) не является Number, вернуть false.
Если floor (abs (аргумент)) ≠ abs(аргумент), вернуть false.
Это происходит потому, что результатом деления является не целое число, а что-то вроде 13496582.999999998
,
Некоторые плавающие числа требуют очень малой точности, которая ограничена используемым типом данных. Например, число 1/3
никогда не может быть выражено полностью как 0.333333333333
потому что есть ограничение на размер типа данных. Поэтому в плавающих операциях всегда будет крошечная ошибка округления.
Изменить: В ответ на комментарий с просьбой дать рекомендацию о том, как с этим справиться, на самом деле есть несколько возможностей. Это зависит от контекста и требуемой точности.
Короче говоря, чтобы преодолеть это, используйте очень маленькую константу Number.EPSILON ( см. Также это) и используйте ее в сравнениях. Отказ от ответственности: это только краткий пример, внимательно прочитайте последствия для предоставленных ссылок.
var myIsInteger = function(n) {
return (n % 1) > Number.EPSILON
};
Мы эффективно проверяем, что остаток от деления с 1 находится в пределах константы.
parseFloat('134965.83') / parseFloat('0.01') = 13496582.999999998
И когда Number.isInteger(13496582.999999998) всегда будет возвращать false