Números y matemáticas

Un carrito de compras suma precios, un juego rastrea una puntuación, un formulario calcula cuánto impuesto cobrar. Todo se reduce a números y hacer aritmética con ellos. JavaScript trata los números como uno de sus bloques de construcción fundamentales, y este capítulo trata sobre lo que puedes hacer con ellos: las matemáticas cotidianas, los ayudantes integrados para redondeo y aleatoriedad, y la parte que confunde a casi todos: convertir texto escrito en una página en números que puedas sumar.
Números y aritmética
JavaScript tiene un número de tipo, y cubre todo. Los números enteros como 42 y los decimales como 9.99 son el mismo tipo de valor, así que nunca tienes que elegir entre ellos:
const price = 9.99;
const quantity = 3;
const total = price * quantity;
console.log(total); // 29.97Haces matemáticas con los símbolos que ya conoces: + suma, - resta, * multiplica, y / divide. Hay uno más que es menos familiar, %, el residuo. Te da lo que queda después de dividir:
const remainder = 7 % 2;
console.log(remainder); // 1Siete dividido por dos es tres con uno de residuo, así que 7 % 2 es 1. Así es como verificas si un número es par: un número par dividido por dos no deja residuo, así que number % 2 es 0 para números pares y 1 para números impares.
number en JavaScript, así que números enteros y decimales son lo mismo y nunca eliges entre ellos. Los operadores son + - * / más %, el residuo, que es lo que queda después de dividir. El truco útil es % 2: es 0 para números pares y 1 para números impares. El objeto Math
Cuando necesitas más que los operadores básicos, JavaScript te da Math, una colección integrada de ayudantes matemáticos. Los llamas por nombre con un punto:
console.log(Math.round(4.6)); // 5
console.log(Math.floor(4.6)); // 4
console.log(Math.ceil(4.1)); // 5Math.round redondea al número entero más cercano, Math.floor siempre redondea hacia abajo, y Math.ceil siempre redondea hacia arriba. También hay Math.max y Math.min, que eligen el más grande o el más pequeño de los números que les das:
console.log(Math.max(3, 8, 5)); // 8
console.log(Math.min(3, 8, 5)); // 3Y Math.random, que te da un decimal aleatorio de 0 hasta (pero no incluyendo) 1. Por sí solo eso es raramente lo que quieres, así que la receta común es multiplicarlo y usar floor para obtener un número entero aleatorio:
const roll = Math.floor(Math.random() * 6) + 1;
console.log(roll); // 4 (un número diferente cada vez)Math.random() * 6 cae en algún lugar de 0 hasta 6, Math.floor lo deja caer a un número entero de 0 a 5, y + 1 lo desplaza a una tirada de dados de 1 a 6.
Math es una caja de herramientas lista de ayudantes matemáticos que llamas con un punto: Math.round, Math.floor (hacia abajo), Math.ceil (hacia arriba), y Math.max / Math.min para el más grande y el más pequeño. Math.random te da un decimal de 0 hasta 1, y la receta que vale la pena memorizar es Math.floor(Math.random() * n) para un número entero aleatorio. Me tomó algunos intentos confiar en ese patrón, así que cópialo y léelo lentamente. Convertir cadenas en números
Cualquier cosa que una persona escriba en una página llega como texto, incluso cuando se parece a un número. Escribe 5 en un cuadro y obtienes la cadena "5", no el número 5. Eso importa porque + en dos cadenas las une en lugar de sumar:
const a = "5";
const b = "3";
console.log(a + b); // "53", no 8Para hacer matemáticas, conviertes el texto en un número primero. La manera más clara es Number():
const count = Number("5");
console.log(count + 3); // 8Hay dos más que verás: parseInt lee un número entero y descarta cualquier decimal, y parseFloat mantiene el decimal:
console.log(parseInt("42px")); // 42
console.log(parseFloat("9.99")); // 9.99Ambos pueden leer un número sentado al inicio de algún texto, como "42px", que Number no puede. También hay un atajo, un + frente a una cadena, que la convierte de la misma manera que lo hace Number:
console.log(+"7"); // 7"5" no es el número 5, y "5" + "3" da "53" en lugar de 8. Convierte primero: Number("5") es la más clara, parseInt lee un número entero, parseFloat mantiene decimales, y un + frente a una cadena es un atajo rápido. Observa la trampa de unión-en-lugar-de-suma, atrapa a todos una vez. Los bordes afilados de los números
Los números en JavaScript tienen una sorpresa que vale la pena ver una vez, temprano. Suma dos decimales simples y puedes obtener una respuesta extraña:
console.log(0.1 + 0.2); // 0.30000000000000004Eso no es un error en tu código. Las computadoras almacenan decimales de una manera que no puede representar cada valor exactamente, así que un pequeño error se cuela. Raramente importa, y cuando importa, redondeas el resultado para exhibición:
const sum = 0.1 + 0.2;
console.log(Math.round(sum * 100) / 100); // 0.3También conocerás un valor llamado NaN, abreviatura de "no es un número". Lo obtienes cuando una operación matemática no tiene una respuesta sensata, como intentar convertir texto sin sentido en un número:
console.log(Number("hello")); // NaNVer NaN en tu salida generalmente significa que una conversión fue mal en algún lugar, así que es una pista útil en lugar de algo que temer.
0.1 + 0.2 resulta ser 0.30000000000000004, que es normal, no un error en tu código. Cuando importa, redondea el resultado antes de mostrarlo. Y NaN significa "no es un número", la respuesta que obtienes cuando una conversión falla, así que tíralo como una pista de que algún texto no se convirtió en un número como esperabas. Hacia dónde van los números a continuación
Los números son uno de un puñado de tipos de datos centrales en JavaScript, sentándose junto a texto y valores verdadero/falso. La mayoría de programas reales los mezclan, sacando un número de una cadena, comparándolo, almacenando el resultado en una variable, y los operadores que hacen esa comparación y combinación son el tema de operadores a continuación.

