Math en JavaScript
En esta lección
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ón | Qué hace | 4.7 | -4.7 |
|---|---|---|---|
Math.round(x) | Al entero más cercano | 5 | -5 |
Math.floor(x) | Hacia abajo | 4 | -5 |
Math.ceil(x) | Hacia arriba | 5 | -4 |
Math.trunc(x) | Quita los decimales | 4 | -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 existecrypto.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).
Pon a prueba lo que has aprendido
¿Te ha quedado claro? Márcala y verás tu progreso en el explorador.