У меня есть серия вычислений Javascript, которые (только в IE) показывают Infinity в зависимости от выбора пользователя.
Как остановить слово Infinity
и, например, показать 0.0
вместо?
У меня есть серия вычислений Javascript, которые (только в IE) показывают Infinity в зависимости от выбора пользователя.
Как остановить слово Infinity
и, например, показать 0.0
вместо?
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Вместо этого вы можете использовать isFinite
, в зависимости от того, как вы хотите лечить NaN
. isFinite
возвращает false
, если ваш номер POSITIVE_INFINITY
, NEGATIVE_INFINITY
или NaN
.
if (isFinite(result))
{
// ...
}
Простой n === n+1
или n === n/0
работает:
function isInfinite(n) {
return n === n/0;
}
Имейте в виду, что нативный isFinite()
заставляет вводить числа. isFinite([])
и isFinite(null)
являются, например, true
.
В ES6
метод Number.isFinite()
определяет, является ли переданное значение конечным числом.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Фактически n === n + 1 будет работать для чисел, больших 51 бит, например
1e16 + 1 === 1e16; // true
1e16 === Infinity; // false
Я столкнулся со сценарием, который требовал, чтобы я проверил, имеет ли значение тип NaN
или Infinity
, но передал строки в качестве правильных результатов. Поскольку многие текстовые строки будут давать ложноположительные результаты NaN
, я сделал простое решение, чтобы обойти это:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Приведенный выше код преобразует значения в строки и проверяет, строго ли они равны NaN или Infinity (вам нужно добавить еще один регистр для отрицательной бесконечности).
Итак:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
Мне нравится использовать 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
Вы можете использовать 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);
}