Saltar al contenido
math.js · devschool

Math en JavaScript

Lección 21 de 38 · 3 min de lectura · Actualizado el

En esta lección
  1. Redondear
  2. Otras funciones útiles
  3. Números aleatorios
  4. Los decimales no son exactos
  5. Mostrar números con formato

Math es un objeto que viene con JavaScript y agrupa constantes y funciones matemáticas. No hace falta crearlo: se usa directamente, Math.round(...).

Redondear

FunciónQué hace4.7-4.7
Math.round(x)Al entero más cercano5-5
Math.floor(x)Hacia abajo4-5
Math.ceil(x)Hacia arriba5-4
Math.trunc(x)Quita los decimales4-4

Math.round redondea los “.5” hacia arriba en el sentido de los números: Math.round(4.5) es 5, pero Math.round(-4.5) es -4, no -5.

Recuerda que en JavaScript no hay un tipo “entero”: Math.round devuelve un number sin decimales, pero sigue siendo del mismo tipo que cualquier otro número.

Redondear a decimales

Math.round solo redondea a enteros. Para dos decimales hay dos opciones:

Math.round(3.14159 * 100) / 100   // 3.14 (un número)
(3.14159).toFixed(2)              // "3.14" (un texto, listo para mostrar)

toFixed devuelve texto. Úsalo al final, justo antes de mostrar el número, no para seguir calculando.

Otras funciones útiles

Math.max(4, 9, 2)          // 9
Math.min(4, 9, 2)          // 2
Math.max(...[4, 9, 2])     // 9: con un array, usa el spread
Math.abs(-7)               // 7: valor absoluto
Math.pow(2, 10)            // 1024 (también 2 ** 10)
Math.sqrt(81)              // 9: raíz cuadrada
Math.cbrt(27)              // 3: raíz cúbica
Math.hypot(3, 4)           // 5: hipotenusa (distancia entre dos puntos)
Math.sign(-3)              // -1: el signo
Math.PI                    // 3.141592653589793

Ejemplo: la distancia entre dos puntos del plano.

function distancia(p, q) {
  return Math.hypot(q.x - p.x, q.y - p.y);
}
distancia({ x: 0, y: 0 }, { x: 3, y: 4 });  // 5

Números aleatorios

Math.random() devuelve un número decimal aleatorio entre 0 (incluido) y 1 (excluido), como 0.7364.... A partir de él se construye todo lo demás:

// Entero entre 0 y n-1
Math.floor(Math.random() * n)

// Entero entre 1 y 6 (un dado)
Math.floor(Math.random() * 6) + 1

// Entero entre min y max, ambos incluidos
function aleatorio(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

¿Por qué funciona? Math.random() * 6 da un decimal entre 0 y 5,999…; Math.floor lo convierte en 0, 1, 2, 3, 4 o 5; y el + 1 lo desplaza a 1-6.

Usa Math.floor, no Math.round: con round, los extremos salen la mitad de veces que el resto de números.

Un elemento al azar de un array:

const colores = ["rojo", "verde", "azul"];
const color = colores[Math.floor(Math.random() * colores.length)];

Barajar un array (algoritmo de Fisher-Yates):

function barajar(array) {
  const copia = [...array];
  for (let i = copia.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [copia[i], copia[j]] = [copia[j], copia[i]];
  }
  return copia;
}

Math.random() es suficiente para juegos y sorteos informales, pero no para nada relacionado con la seguridad (contraseñas, códigos de verificación…). Para eso existe crypto.getRandomValues().

Los decimales no son exactos

Como en casi todos los lenguajes, los decimales se guardan en binario de forma aproximada:

0.1 + 0.2              // 0.30000000000000004
0.1 + 0.2 === 0.3      // false

Consecuencias prácticas:

  • No compares decimales con ===. Comprueba que la diferencia sea muy pequeña: Math.abs(a - b) < 0.000001.
  • Con dinero, trabaja en céntimos (números enteros): 19,99 € se guarda como 1999. Solo al mostrarlo lo divides entre 100.

Mostrar números con formato

Intl.NumberFormat formatea números según el idioma: separador de miles, coma decimal, moneda…

const euros = new Intl.NumberFormat("es-ES", { style: "currency", currency: "EUR" });
euros.format(1234.5)        // "1234,50 €"

new Intl.NumberFormat("es-ES").format(9876543.21)   // "9.876.543,21"
new Intl.NumberFormat("es-ES", { style: "percent" }).format(0.25)  // "25 %"

Guarda y calcula con números normales; usa Intl solo para mostrarlos al usuario.

Pruébalo tú

Cambia el código y pulsa Ejecutar (o Ctrl + Enter).

math.js
Consola

Pon a prueba lo que has aprendido

[JavaScript] ¿Qué muestra la consola?
console.log(0.1 + 0.2 === 0.3);

[JavaScript] ¿Qué expresión da un entero aleatorio entre 1 y 6?

[JavaScript] ¿Qué devuelve (3.14159).toFixed(2)?

¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.