Tengo una serie de cálculos de Javascript que (solo en IE) muestran Infinity dependiendo de las opciones del usuario.
¿Cómo se detiene la Infinity
aparición de la palabra y, por ejemplo, se muestra en su 0.0
lugar?
Respuestas:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
En su lugar, podría usar la isFinite
función, dependiendo de cómo quiera tratar NaN
. isFinite
devuelve false
si su número es POSITIVE_INFINITY
, NEGATIVE_INFINITY
o NaN
.
if (isFinite(result))
{
// ...
}
Infinity
propiedad global no es de solo lectura, lo que significa que se puede redefinir: por ejemplo, var x = 42; Infinity = 42; alert(x === Infinity);
muestra "verdadero" . (Es cierto que ese es un caso oscuro, y cualquiera que decida redefinir Infinity
, NaN
etc. debe esperar que sucedan cosas extrañas).
Number.(POSITIVE|NEGATIVE)_INFINITY
tampoco es de solo lectura , Infinity
es de solo lectura en modo estricto. Además, ¿qué pasa con el -?1/0
caso que les presenté? De todos modos, casi siempre deberías usar isFinite
en su lugar.
Number.POSITIVE_INFINITY
y Number.NEGATIVE_INFINITY
son de solo lectura (probados en Chrome8, FF3.6 e IE8). El uso 1/0
funciona bien, pero no será tan obvio para quienes mantienen su código lo que realmente está tratando de probar. Estoy de acuerdo en que usar isFinite
es casi siempre la mejor manera de hacer las cosas, por eso lo mencioné en mi respuesta, pero solo el OP puede decidir si cumple con sus requisitos.
Object.defineProperty
y __defineGetter__
. Infinity
, por otro lado, no es configurable en modo estricto.
Un simple n === n+1
o n === n/0
funciona:
function isInfinite(n) {
return n === n/0;
}
Tenga en cuenta que el nativo isFinite()
coacciona las entradas a los números. isFinite([])
y isFinite(null)
son ambos, true
por ejemplo.
n === n+1
se evalúa como verdadero para todos los números mayores que 2 ^ 53, es decir, 1e30. El truco de división funciona, incluso para NaN e -Infinity. Sin embargo, la respuesta de LukeH le brinda un código mucho más legible.
n+1
no se pueden representar y están sujetos a redondeo. Bueno, incluso los números enteros se ven afectados por los errores de redondeo. Por cierto, no creo que tu código sea "a prueba de matemáticas", solo inténtalo n === n/-0
. Al completar los reales con +/- inf, su límite no está bien definido a menos que se asuma que la secuencia cero subyacente es positiva.
En ES6
, El Number.isFinite()
método determina si el valor pasado es un número finito.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Me gusta usar Lodash por una variedad de razones de codificación defensiva , así como por la legibilidad. ES6 Number.isFinite
es excelente y no tiene problemas con valores no numéricos, pero si ES6 no es posible, ya tiene lodash o desea un código más breve: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Me encontré con un escenario que me obligaba a verificar si el valor es del tipo NaN
o, Infinity
pero pasar cadenas como resultados válidos. Debido a que muchas cadenas de texto producirán falsos positivos NaN
, he creado una solución simple para eludir eso:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
El código anterior convierte los valores en cadenas y comprueba si son estrictamente iguales a NaN o Infinity (deberá agregar otro caso para el infinito negativo).
Entonces:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
s, etc.
toString()
lugar? Siéntase libre de votar en contra o indicar las razones por las que esto podría producir resultados inconsistentes o por qué no se recomienda exactamente este método. Hasta el momento, todavía siento que añade una opción para quien sea que esté buscando una respuesta y no hay ninguna razón concretas por las que esto es peligroso, inestable, etc.
Puede usar isFinite en la ventana isFinite(123)
:
Puedes escribir una función como:
function isInfinite(num) {
return !isFinite(num);
}
Y usa como:
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
También puede Number.isFinit
E, que también comprobar si el valor es un número demasiado y es más preciso para la comprobación undefined
y null
etc ...
O puede rellenarlo así:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
lugar de-?Infinity
o-?1/0
?