Как проверить, оценивается ли число до бесконечности?

У меня есть серия вычислений Javascript, которые (только в IE) показывают Infinity в зависимости от выбора пользователя.

Как остановить слово Infinity и, например, показать 0.0 вместо?

Ответ 1

if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
    // ...
}

Вместо этого вы можете использовать isFinite, в зависимости от того, как вы хотите лечить NaN. isFinite возвращает false, если ваш номер POSITIVE_INFINITY, NEGATIVE_INFINITY или NaN.

if (isFinite(result))
{
    // ...
}

Ответ 2

Простой n === n+1 или n === n/0 работает:

function isInfinite(n) {
  return n === n/0;
}

Имейте в виду, что нативный isFinite() заставляет вводить числа. isFinite([]) и isFinite(null) являются, например, true.

Ответ 3

В ES6 метод Number.isFinite() определяет, является ли переданное значение конечным числом.

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

Ответ 4

Фактически n === n + 1 будет работать для чисел, больших 51 бит, например

1e16 + 1 === 1e16; // true
1e16 === Infinity; // false

Ответ 5

Я столкнулся со сценарием, который требовал, чтобы я проверил, имеет ли значение тип NaN или Infinity, но передал строки в качестве правильных результатов. Поскольку многие текстовые строки будут давать ложноположительные результаты NaN, я сделал простое решение, чтобы обойти это:

  const testInput = input => input + "" === "NaN" || input + "" === "Infinity";

Приведенный выше код преобразует значения в строки и проверяет, строго ли они равны NaN или Infinity (вам нужно добавить еще один регистр для отрицательной бесконечности).

Итак:

testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false

Ответ 6

Мне нравится использовать Lodash для различных целей кодирования, а также для удобства чтения. ES6 Number.isFinite великолепен и не имеет проблем с нечисловыми значениями, но если ES6 невозможен, у вас уже есть код lodash или вам нужен более короткий код: _.isFinite

_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false

_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true

Ответ 7

Вы можете использовать isFinite в окне, isFinite(123):

Вы можете написать функцию вроде:

function isInfinite(num) {
 return !isFinite(num);
}

И используйте как:

isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true

Вы также можете Number.isFinit e, который также проверяет, является ли значение тоже Number, и является более точным для проверки undefined и null и т.д...

Или вы можете заполнить следующим образом:

Number.isFinite = Number.isFinite || function(value) {
  return typeof value === 'number' && isFinite(value);
}