Números en JavaScript
JavaScript admite varios tipos de números. Comprenderlos es clave para programar con eficacia. Este artículo explica tipos, conversión y más.
Introducción a los números en JavaScript
JavaScript es un lenguaje dinámico, y la forma en que almacena los números tiene consecuencias directas en el código cotidiano: por qué 0.1 + 0.2 no es exactamente 0.3, por qué los enteros muy grandes pierden precisión, y cómo redondear, formatear y analizar valores de forma segura. Esta página cubre el tipo number regular, los valores especiales Infinity y NaN, las funciones de conversión, y los errores comunes que confunden a la mayoría de los desarrolladores — con ejemplos ejecutables que puedes editar.
Tipos de datos numéricos
JavaScript tiene exactamente dos tipos de datos numéricos:
number— el tipo cotidiano. Utiliza el formato IEEE-754 de 64 bits ("punto flotante de doble precisión"), por lo que el mismo tipo almacena tanto enteros como42y decimales como3.14. No existe unintofloatseparado.BigInt— para enteros que superan el rango seguro denumber(más sobre esto a continuación). Un literal BigInt termina enn, p. ej.9007199254740993n.
Puedes distinguirlos con typeof:
Escritura de números en JavaScript
Más allá de los dígitos simples, JavaScript ofrece algunas facilidades para mejorar la legibilidad:
let billion = 1e9; // scientific notation → 1000000000
let ms = 1e-6; // 0.000001 (one microsecond)
let big = 1_000_000; // underscores as visual separators (ES2021)1e9 significa "1 seguido de 9 ceros"; 1e-6 significa "mueve el punto decimal 6 posiciones a la izquierda." Los guiones bajos en 1_000_000 son ignorados por el motor — solo ayudan a los humanos a leer números grandes.
Números hexadecimales, binarios y octales
JavaScript puede leer literales en varios sistemas numéricos. Todos se almacenan como el mismo tipo number — solo difiere la notación:
let hex = 0xFF; // 255 (base 16, prefix 0x)
let bin = 0b1010; // 10 (base 2, prefix 0b)
let oct = 0o744; // 484 (base 8, prefix 0o)El método toString
num.toString(base) convierte un número en una string en cualquier base del 2 al 36 — la dirección inversa de los literales anteriores:
Nota: para llamar a un método directamente sobre un literal necesitas dos puntos o paréntesis — 255..toString(16) o (255).toString(16) — porque 255. se interpreta como un punto decimal.
Métodos de redondeo
JavaScript proporciona varias funciones para redondear números:
Math.floor(): Redondea un número hacia abajo al entero más cercano.
Math.ceil(): Redondea un número hacia arriba al entero más cercano.
Math.round(): Redondea un número al entero más cercano, siguiendo las reglas matemáticas estándar.
Math.trunc(): Elimina los dígitos fraccionarios, truncando esencialmente el número.
La diferencia entre Math.floor y Math.trunc solo se manifiesta con negativos: Math.floor(-3.5) es -4 (redondea hacia -Infinity), mientras que Math.trunc(-3.5) es -3 (simplemente descarta la fracción). Para más utilidades de redondeo y matemáticas, consulta el capítulo JavaScript Math.
Formateo de números: toFixed y toPrecision
Cuando necesitas un número como string con una forma fija — dinero, porcentajes, informes — usa estas funciones en lugar de Math.round:
toFixed(digits)mantiene un número fijo de dígitos después del punto decimal.toPrecision(digits)mantiene un número fijo de dígitos significativos.
Ambas devuelven strings. Envuelve el resultado en Number() si necesitas recuperar un número. toLocaleString() es la opción ideal para separadores de miles y moneda en la configuración regional del usuario.
Manejo de cálculos imprecisos
Dado que el tipo number es punto flotante binario, algunas fracciones decimales no pueden almacenarse exactamente — el famoso 0.1 + 0.2 !== 0.3. Esto no es un error de JavaScript; todo lenguaje IEEE-754 lo tiene.
La regla general: nunca compares resultados de punto flotante con ===. O bien redondea ambos lados primero, o verifica que su diferencia sea menor que Number.EPSILON (el intervalo más pequeño entre 1 y el siguiente número representable).
Enteros seguros
Un number puede almacenar enteros exactamente solo hasta Number.MAX_SAFE_INTEGER (2^53 − 1). Más allá de ese límite, dos enteros distintos pueden colapsar al mismo valor:
Si trabajas con IDs, marcas de tiempo en nanosegundos o contadores grandes que superen este límite, cambia a BigInt.
Valores numéricos especiales
Comprendiendo Infinity, -Infinity y NaN en JavaScript:
- Infinity: Representa el infinito, un valor mayor que cualquier otro número. Obtienes este resultado cuando divides un número por cero o cuando superas el límite superior de los números de punto flotante.
- -Infinity: Representa el infinito negativo, un valor menor que cualquier otro número. Esto ocurre cuando divides un número negativo por cero o superas el límite inferior de los números de punto flotante.
- NaN: Significa "Not-a-Number" (No es un número). Este valor resulta de una operación matemática indefinida o irrepresentable, como dividir cero por cero.
Los métodos isNaN() e isFinite() para verificar estos valores especiales:
isNaN(): Comprueba si un valor esNaN. Ten en cuenta que elisNaN()global realiza coerción de tipos implícita, por lo queisNaN('hello')devuelvetrue. Para una verificación de tipos estricta, usaNumber.isNaN(), que solo devuelvetruesi el valor es realmenteNaN.isFinite(): Comprueba si un valor es un número finito, devolviendofalseparaInfinity,-InfinityoNaN.
Ejemplos:
isNaN('hello')devuelvetrueporque la string se convierte enNaN.isFinite(2 / 0)devuelvefalse, ya que2 / 0resulta enInfinity, que no es finito.
Conversión numérica: Number(), parseInt y parseFloat
Hay tres formas comunes de convertir una string en un número, y elegir la correcta importa.
Number(value) es estricto: la cadena completa debe ser un número válido (los espacios en blanco se recortan), de lo contrario obtienes NaN. Una string vacía se convierte en 0.
parseInt(value, radix) es más flexible: lee desde la izquierda y se detiene en el primer carácter que no forma parte de un entero. Si el primer carácter no puede analizarse, devuelve NaN. Siempre pasa el radix (base) para evitar sorpresas.
parseFloat(value) es como parseInt pero entiende el punto decimal, leyendo hasta encontrar un carácter que no forme parte de un número de punto flotante:
Regla general: usa Number() cuando la string deba ser completamente numérica (p. ej., validar entradas de formulario), y parseInt/parseFloat cuando necesites extraer un número de texto como '100px'.
Conclusión
JavaScript almacena todos los números cotidianos como valores de punto flotante de 64 bits, lo que explica las peculiaridades de redondeo, el límite de enteros seguros, y por qué el formateo y la comparación requieren cuidado. Saber cuándo usar toFixed, Number.EPSILON, BigInt o parseInt te permite escribir código que se comporta de manera predecible. Continúa con las guías de tipos relacionados: Strings, BigInt, el objeto Math y Tipos de datos.