¿Cómo encontrar que un número es float
o integer
?
1.25 --> float
1 --> integer
0 --> integer
0.25 --> float
javascript
types
numbers
coure2011
fuente
fuente
<nit-pick>
JavaScript no tiene diferentes tipos de números enteros y flotantes. Cada número en JavaScript es solo unNumber
.</nit-pick>
Infinity
un valor entero o no entero en lo que a usted respecta? Las respuestas aquí se distribuyen de manera bastante uniforme en este puntaje.Infinity
no puede considerarse un entero.Respuestas:
verifique el resto al dividir entre 1:
Si no sabe que el argumento es un número, necesita dos pruebas:
Actualización 2019 5 años después de que se escribió esta respuesta, se estandarizó una solución en ECMA Script 2015. Esa solución se cubre en esta respuesta .
fuente
true
,false
,null
, una matriz vacía, una matriz que contiene un solo número entero, una matriz que contiene una cadena que representa un número entero, y tal vez más.""
y1.0
isInt("");
&&isInt(1.0);
ambos dan como resultadotrue
ver esta demostración jsbin.com/elohuq/1/editfunction last (array) { return array[array.length - 1]; }
, ¿es "simplemente incorrecto" o "La peor respuesta en SO" porque no comprueba si el argumento es una matriz primero? Sí, es una buena práctica verificar los argumentos, pero eso es responsabilidad del desarrollador. Las respuestas SO deben ser breves y responder directamente la pregunta lo más claramente posible.Pruebe estas funciones para comprobar si un valor es un valor primitivo numérico que no tiene una parte fraccional y está dentro de los límites de tamaño de lo que se puede representar como un entero exacto.
fuente
n===+n
para verificar numérico,n|0
redondear), pero con operadores integrados. funkyparseFloat()
primero debe llamar .|
(OR) solo operan en enteros de 32 bits con signo. OP no indica si el objetivo es verificar los valores int32 firmados. Entonces esto no funcionará con números fuera de rango.isInteger(5000000000)
volverá lofalse
que está mal!¿Por qué no algo como esto?
fuente
n
se convierte en una cadena porparseInt
. Ver MDN . Pero usaré esta solución. :)Hay un método llamado
Number.isInteger()
que actualmente se implementa en todo menos en IE. MDN también proporciona un polyfill para otros navegadores:Sin embargo, para la mayoría de los casos de uso, es mejor usar el
Number.isSafeInteger
que también comprueba si el valor es tan alto / bajo que cualquier lugar decimal se habría perdido de todos modos. MDN también tiene un polyfil para esto. (También necesita elisInteger
pollyfill de arriba).fuente
12.0 ∈ ℤ
.Number.isInteger
. Sin embargo, es un polyfill correcto paraNumber.isSafeInteger
.Number.isInteger
no debe verificar si el número es un "entero seguro". Ver en MDN: isInteger y isSafeInteger .Puede usar una expresión regular simple:
O también puede usar las siguientes funciones, según sus necesidades. Son desarrollados por el Proyecto PHPJS .
is_int()
=> Verifique si el tipo de variable es entero y si su contenido es enterois_float()
=> Verifique si el tipo de variable es flotante y si su contenido es flotantectype_digit()
=> Verifique si el tipo de variable es una cadena y si su contenido solo tiene dígitos decimalesActualización 1
Ahora también verifica los números negativos, ¡gracias por el comentario de @ChrisBartley !
fuente
/^[0-9]+$/.test(String(value))
/^[0-9]+$/.test(''+value)
return /^-?\d+$/.test(String(value));
Aquí hay funciones eficientes que verifican si el valor es un número o se puede convertir de manera segura a un número:
Y para enteros (devolvería falso si el valor es flotante):
La eficiencia aquí es que parseInt (o parseNumber) se evitan cuando el valor ya es un número. Ambas funciones de análisis siempre se convierten en cadenas primero y luego intentan analizar esa cadena, lo que sería un desperdicio si el valor ya es un número.
¡Gracias a las otras publicaciones aquí por proporcionar más ideas para la optimización!
fuente
fuente
1.2
. Siempre pruebe las funciones numéricas con 0.1 0.2 0.3Funciona para todos los casos.
fuente
isInt('1')
vuelvetrue
como se esperaba (al menos para mí). Bastante raro, sin embargo, esto vuelvetrue
aisInt([5])
también. No me importó a mí, pero sí a ti, así que ten cuidado.Como otros mencionaron, solo tienes dobles en JS. Entonces, ¿cómo define un número como un número entero? Simplemente verifique si el número redondeado es igual a sí mismo:
fuente
isFloat('abc')
devuelvetrue
isFloat(NaN) // true
¿Que tal este?
fuente
console.log(isFloat(1.0));
resultados falsos.Esto es lo que uso para los enteros:
Corto, agradable :) Funciona todo el tiempo. Esto es lo que sugiere David Flanagan si no me equivoco.
fuente
parseFloat
?Realmente depende de lo que quieras lograr. Si desea "emular" idiomas fuertemente tipados, le sugiero que no lo intente. Como otros mencionaron, todos los números tienen la misma representación (el mismo tipo).
Usando algo como lo que Claudiu proporcionó:
isInteger( 1.0 )
-> verdaderoque se ve bien para el sentido común, pero en algo como C obtendrías
false
fuente
Cualquier número Float con una parte decimal cero (p. Ej. 1.0, 12.00, 0.0) se convierte implícitamente en Integer, por lo que no es posible verificar si son Float o no.
fuente
fuente
!!(24.0%1)
es falsoRealmente no tiene que ser tan complicado. El valor numérico de los equivalentes parseFloat () y parseInt () de un entero será el mismo. Así puedes hacer así:
Entonces
Esto también permitirá verificaciones de cadenas y, por lo tanto, no es estricto. Si desea una solución de tipo fuerte (es decir, no funcionará con cadenas):
fuente
No he tenido un caso donde esto no hizo el trabajo.
fuente
2
es un número entero y23
se considera un segundo argumento para la función. En javascript, los decimales se escriben usando punto como separador, por lo que debería ser así2.23
.ESTE ES EL CÓDIGO FINAL PARA VERIFICAR TANTO INT Y FLOTADOR
O
fuente
fuente
Es simple como:
Prueba esto en la consola:
Esto confunde a mucha gente. Cada vez que algo es .0, ya no es un flotador. Es un entero. O simplemente puede llamarlo "una cosa numérica", ya que no existe una distinción estricta como en aquel entonces en C. Los viejos tiempos.
Básicamente, todo lo que puede hacer es verificar el número entero aceptando el hecho de que 1,000 es un número entero.
Nota al margen interesante
Hubo un comentario sobre grandes números. Los números enormes no significan ningún problema para este enfoque; cada vez que parseInt no pueda manejar el número (porque es demasiado grande) devolverá algo más que el valor real, por lo que la prueba devolverá FALSE. Esto es algo bueno porque si considera que algo es un "número", normalmente espera que JS pueda calcular con él, así que sí, los números son limitados y parseInt lo tendrá en cuenta , para decirlo de esta manera.
Prueba esto:
En mi navegador (IE8) esto devuelve "a está bien; b falla", que es exactamente debido al gran número en b. El límite puede variar, pero supongo que 20 dígitos "deberían ser suficientes para cualquiera", por citar un clásico :)
fuente
Number.isInteger
.Number.isInteger
funciona. Una prueba de una sola línea esn === (n | 0)
como se muestra en otra respuesta.Esta solución funcionó para mí.
fuente
Para enteros uso esto
fuente
En el script java todos los números son
internally 64 bit floating point
iguales al doble en java. No hay tipos diferentes en javascript, todos están representados por tiponumber
. Por lo tanto, no podrá hacer uninstanceof
cheque. Sin embargo, puede usar las soluciones anteriores para averiguar si es un número fraccionario. Los diseñadores de Java Script sintieron con un solo tipo que pueden evitar numerosos errores de conversión de tipos.fuente
Algunas veces, los objetos numéricos no le permiten usar directamente el operador mod (%), si se enfrenta a ese caso, puede usar esta solución.
fuente
Intentando algunas de las respuestas aquí, terminé escribiendo esta solución. Esto funciona también con números dentro de una cadena.
fuente
Tal vez esto no sea tan eficaz como el% de respuesta, lo que evita que primero tenga que convertir a una cadena, pero todavía no he visto a nadie publicarlo, así que aquí hay otra opción que debería funcionar bien:
fuente
Para aquellos curiosos, usando Benchmark.js probé las respuestas más votadas (y la publicada hoy) en esta publicación, aquí están mis resultados:
fuente
Aquí está mi código. Comprueba para asegurarse de que no es una cadena vacía (que de lo contrario pasará) y luego la convierte a formato numérico. Ahora, dependiendo de si desea que '1.1' sea igual a 1.1, esto puede o no ser lo que está buscando.
fuente
Me gusta esta pequeña función, que devolverá verdadero para los enteros positivos y negativos:
Esto funciona porque 1 o "1" se convierte en "1.0", que esNaN () devuelve falso en (que luego negamos y devolvemos), pero 1.0 o "1.0" se convierte en "1.0.0", mientras que "cadena" se convierte en "cadena". 0 ", ninguno de los cuales son números, por lo que isNaN () devuelve falso (y, de nuevo, se niega).
Si solo quieres enteros positivos, existe esta variante:
o, para enteros negativos:
isPositiveInt () funciona moviendo la cadena numérica concatenada por delante del valor a probar. Por ejemplo, isPositiveInt (1) da como resultado que isNaN () evalúe "01", que evalúa falso. Mientras tanto, isPositiveInt (-1) da como resultado que isNaN () evalúe "0-1", que evalúa verdadero. Negamos el valor de retorno y eso nos da lo que queremos. isNegativeInt () funciona de manera similar, pero sin negar el valor de retorno de isNaN ().
Editar:
Mi implementación original también devolvería verdadero en matrices y cadenas vacías. Esta implementación no tiene ese defecto. También tiene el beneficio de regresar temprano si val no es una cadena o número, o si es una cadena vacía, lo que lo hace más rápido en estos casos. Puede modificarlo aún más reemplazando las dos primeras cláusulas con
si solo desea hacer coincidir números literales (y no cadenas)
Editar:
Todavía no puedo publicar comentarios, así que estoy agregando esto a mi respuesta. El punto de referencia publicado por @Asok es muy informativo; sin embargo, la función más rápida no cumple con los requisitos, ya que también devuelve VERDADERO para flotantes, matrices, booleanos y cadenas vacías.
Creé el siguiente conjunto de pruebas para probar cada una de las funciones, agregando mi respuesta a la lista también (función 8, que analiza las cadenas, y la función 9, que no):
También reescribí el punto de referencia con la función # 8 agregada a la lista. No publicaré el resultado, ya que son un poco vergonzosos (por ejemplo, esa función NO es rápida) ...
Los resultados (abreviado: eliminé las pruebas exitosas, ya que el resultado es bastante largo) son los siguientes:
He dejado en fallas para que pueda ver dónde falla cada función, y el '#' prueba (cadena) para que pueda ver cómo cada función maneja los valores enteros y flotantes en las cadenas, ya que algunos pueden querer analizarlos como números y otros podría no.
De las 10 funciones probadas, las que realmente cumplen con los requisitos de OP son [1,3,5,6,8,9]
fuente
Condición para validación flotante:
Condición para la validación de enteros:
Espero que esto pueda ser útil.
fuente
Puede agregar
typeof a === 'number'
si desea excluir cadenas.fuente