Ошибка деления 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

Другие вопросы по тегам