Ir al contenido
wannacode

Operadores y aritmética

En resumen: Los operadores aritméticos +, -, *, / y % hacen cálculos con números: / nunca corta la parte decimal (17 / 5 es 3.4), Math.trunc corta la parte decimal y % da el resto.

Problema

La cuenta en la mesa

Has pedido tres cafés a 2,50 € y dos cruasanes a 1,50 €. Pagas con un billete de 20 €. ¿Cuánto es la cuenta y cuánto cambio te tienen que dar?

Lo puedes calcular de cabeza. Pero la caja de la cafetería hace esta cuenta cientos de veces al día, con precios y cantidades distintos. El programa tiene que calcular por sí solo.

La idea

Los operadores aritméticos

Calculas igual que en papel: + suma, - resta, * multiplica, / divide. Estos signos se llaman operadores.

const coffee = 2.5;
const croissant = 1.5;
const total = 3 * coffee + 2 * croissant;
const change = 20 - total;
console.log("Total: " + total + " €");
console.log("Cambio: " + change + " €");
Salida
Total: 10.5 €
Cambio: 9.5 €

El orden es el mismo que en matemáticas: primero * y /, después + y -. Por eso 3 * coffee + 2 * croissant es 7,5 + 3. Si quieres otro orden, pones paréntesis: (2 + 3) * 4 es 20.

Hay también un quinto operador, %. De él trata la siguiente idea.

Más precisamente, para curiosos
  • Los operadores con la misma prioridad se calculan de izquierda a derecha: 20 - 5 - 3 es 12, no 18.
  • - delante de un número lo hace negativo: -total.
  • Con texto, + no suma, sino que pega. En cuanto hay texto a la izquierda, todo lo que viene después se pega como texto. Esa es la trampa de la siguiente tarjeta.

Pruébalo

Entradas para el concierto

Tres entradas a 8 € y 5 € de gastos de gestión del pedido.

¿Qué imprimirá el programa?

const tickets = 3;
const fee = 5;
console.log("Total: " + tickets * 8 + fee);
Respuesta

Problema

2,25 horas en lugar de 2 h 15 min

La película dura 135 minutos. Quieres mostrarla en horas y minutos: 2 h 15 min. El primer intento:

const minutes = 135;
const hours = minutes / 60;
console.log(hours + " h");
Salida
2.25 h

En JavaScript, / siempre da un resultado decimal, aunque los dos números sean enteros: 6 / 3 es 2, y 17 / 3 es 5.666666666666667. Pero aquí necesitas dos horas enteras y los minutos que sobran. ¿Cómo se obtiene solo la parte entera?

La idea

La parte entera y el resto

Math.trunc(...) corta la parte decimal de un número: Math.trunc(2.25) es 2. Así, Math.trunc(135 / 60) da las horas enteras, y Math.trunc(17 / 3) es 5. Esto se llama división entera. Math es un conjunto de cálculos ya hechos. Al final de la lección verás más.

Aquí la tienes paso a paso, con la suma de tres notas:

const math = 5;
const physics = 6;
const english = 6;
const whole = Math.trunc((math + physics + english) / 3);
console.log("Parte entera: " + whole);
Paso a paso, en palabras
  1. Tres notas: 5, 6, 6.
  2. Primero los paréntesis: 5 + 6 + 6 = 17.
  3. 17 / 3 es 5,667…, y Math.trunc se queda solo con la parte entera: ¿cuántos grupos enteros de 3 caben en 17? 5.
  4. El resto 2 (es decir, 17 % 3) se descarta. El resultado es el número entero 5.
  5. 5 se guarda en whole.
  6. Se imprime «Parte entera: 5». La parte decimal (5.67) no está en el resultado.

Lo que se corta no se pierde del todo. El operador % da el resto de la división: 17 % 3 es 2, porque 17 = 5 · 3 + 2.

Juntos, los dos dividen una cantidad en partes enteras y un resto. La película dura 135 minutos:

const minutes = 135;
const hours = Math.trunc(minutes / 60);
const rest = minutes % 60;
console.log(hours + " h " + rest + " min");
Salida
2 h 15 min

Vas a necesitar % a menudo. Un número es par si n % 2 es 0. La última cifra de un número es n % 10.

Más precisamente, para curiosos
  • Con números negativos Math.trunc corta hacia el cero, y el resto tiene el signo del dividendo. % también funciona con números decimales:
console.log(Math.trunc(-7 / 2));
console.log(-7 % 2);
console.log(7.5 % 2);
Salida
-3
-1
1.5
  • Dividir entre 0 no detiene el programa: 5 / 0 da Infinity, y 0 / 0 y 5 % 0 dan NaN («no es un número»).

Pruébalo

Botellas en cajas

En una caja caben 6 botellas. Tienes 17.

¿Qué imprimirá el programa?

const bottles = 17;
const perCase = 6;
console.log(Math.trunc(bottles / perCase) + " cajas");
console.log(bottles % perCase + " de sobra");
Respuesta

La idea

Conversión entre tipos

En JavaScript los números son de un solo tipo, number. No hay tipos enteros y decimales separados entre los que convertir: / da un resultado decimal, como has visto. Un número entero a partir de uno decimal lo obtienes con Math:

const total = 5 + 6 + 6;
const average = total / 3;
console.log(average);
console.log(average.toFixed(2));
const whole = Math.trunc(9.99);
console.log(whole);
Salida
5.666666666666667
5.67
9
  • Math.trunc(9.99) es 9: corta la parte decimal, no redondea;
  • Math.round(9.99) es 10: redondea al número entero más cercano;
  • Math.floor(9.99) es 9 y Math.ceil(9.01) es 10: redondean hacia abajo y hacia arriba.

JavaScript sí tiene conversión entre tipos de texto a número: es Number(...), de la lección sobre la entrada.

Más precisamente, para curiosos
  • Cada carácter tiene un código, un número en la tabla de caracteres. charCodeAt(0) da el código del primer carácter, y String.fromCharCode crea un carácter a partir de un código:
console.log("A".charCodeAt(0));
console.log(String.fromCharCode(66));
const maxInt = 2147483647;
console.log(maxInt + 1);
console.log(9007199254740992 + 1);
Salida
65
B
2147483648
9007199254740992
  • En Java y C#, int llega hasta 2 147 483 647, y uno más «da la vuelta» hasta un número negativo. En JavaScript 2147483647 + 1 es 2147483648 sin más. El límite está en otro sitio: los números enteros son exactos hasta 9 007 199 254 740 991, y a partir de ahí pierden precisión (la última línea). Para enteros más grandes está BigInt.

Pruébalo

Encuentra el error

La factura de la luz es de 125 € y se reparte entre tres compañeros de piso. El programa dice que cada uno paga 41,00 €, pero deberían ser 41,67 €. ¿En qué línea está el error?

Elige la línea con el error.

La idea

Formas abreviadas: += y ++

A menudo cambias un valor a partir de sí mismo: el saldo de la tarjeta baja con cada compra, un contador sube de uno en uno. Hay una forma corta de escribirlo:

let balance = 20;
let purchases = 0;
balance -= 4.5;
purchases++;
balance -= 3.5;
purchases++;
console.log(purchases + " compras, quedan " + balance + " €");
Salida
2 compras, quedan 12 €
Escribes Significa
balance -= 4.5; balance = balance - 4.5;
total += price; total = total + price;
x *= 2;, x /= 2;, x %= 2; lo mismo con *, / y %
purchases++; purchases = purchases + 1;
seats--; seats = seats - 1;

+= también funciona con texto: message += "!"; pega un signo de exclamación al final.

Más precisamente, para curiosos

++ también puede ir delante de la variable. En su propia línea no hay diferencia. Dentro de una expresión sí la hay: a++ da el valor antiguo y después lo aumenta, ++a primero lo aumenta y da el valor nuevo.

let a = 5;
const b = a++;
const c = ++a;
console.log(a + " " + b + " " + c);
Salida
7 5 7

Un código así es difícil de leer. Escribe ++ y -- en su propia línea.

La idea

Math: raíces, potencias, redondeo

Una pizzería vende una pizza de 30 cm al mismo precio que dos pizzas de 20 cm. ¿Qué es más? El área de un círculo es π · r². Para la potencia y para π hay algo ya hecho en Math: escribes el nombre y los números entre paréntesis. Math está siempre disponible, sin cargarlo. Son funciones, trozos de código ya hechos. Escribirás las tuyas en el módulo «Funciones».

const big = Math.PI * Math.pow(15, 2);
const small = 2 * Math.PI * Math.pow(10, 2);
console.log(`Una de 30 cm: ${big.toFixed(1)} cm²`);
console.log(`Dos de 20 cm: ${small.toFixed(1)} cm²`);
console.log(Math.sqrt(144));
console.log(Math.abs(-7.5));
Salida
Una de 30 cm: 706.9 cm²
Dos de 20 cm: 628.3 cm²
12
7.5

Una pizza grande es más que dos pequeñas.

Escribes Qué da
Math.sqrt(x) la raíz cuadrada
Math.pow(x, n) o x ** n x elevado a n
Math.abs(x) el valor absoluto (sin el signo)
Math.round(x) redondeo a un número entero
Math.trunc(x) la parte entera, sin redondear
Math.PI el número π, 3,14159…

En JavaScript Math.sqrt(144) es 12 sin más: el número es del mismo tipo, sea entero o decimal.

Más precisamente, para curiosos
  • Redondear 2,5: los lenguajes dan resultados distintos.
console.log(Math.round(2.5));
console.log(Math.round(3.5));
console.log(Math.round(-2.5));
console.log(Math.round(5.678 * 100) / 100);
Salida
3
4
-2
5.68
  • Math.round redondea «la mitad» hacia arriba, hacia el número mayor: 2,5 pasa a ser 3, y -2,5 pasa a ser -2. Para dos cifras decimales multiplicas por 100, redondeas y divides entre 100. Si es solo para imprimir, toFixed(2) es más cómodo.
  • toFixed no sigue la configuración de idioma de la computadora: el punto sigue siendo un punto en todas partes.

Ejercicio

Que calcule el programa

Resuelve las tareas en tu editor. Cada número de la entrada va en una línea aparte.

1. Media de tres números. Lee tres números enteros e imprime su media con dos cifras decimales. Aquí necesitas la división decimal.

Entrada
5
6
6
Salida
Media: 5.67

2. Segundos en horas. Lee un número de segundos y divídelo en horas, minutos y segundos. Pista: una hora tiene 3600 segundos, y % da lo que sobra.

Entrada
3725
Salida
1 h 2 min 5 s

3. Volumen de una esfera. Lee el radio e imprime el volumen: V = 4/3 · π · r³. Aquí 4 / 3 es 1,333…, como debe ser.

Entrada
10
Salida
Volumen: 4188.79 cm³

4. Celsius a Fahrenheit. F = C · 9 / 5 + 32. Lee la temperatura en grados Celsius.

Entrada
37
Salida
37.0 °C = 98.6 °F

Más tareas

  • Pulgadas a centímetros. Una pulgada son 2,54 cm. Para 12 pulgadas: 30.48 cm.
  • Área de un rectángulo. Lee el largo y el ancho, e imprime el área (largo · ancho).
  • Área de un cuadrado. Lee el lado e imprime el área. Hazlo una vez con * y otra con Math.pow.
  • Radianes a grados. Grados = radianes · 180 / π. Para 3.14159: 180.00°.
  • Horas a segundos. Lee un número de horas e imprime cuántos segundos son. Para 2 horas: 7200.
  • El código de un carácter. Lee un carácter e imprime su código. Para A: 65. El primer carácter del texto leído lo obtienes con (await ask(""))[0]. Qué significa esto lo verás en la lección sobre el texto.

Test

Ponte a prueba

1. ¿Cuánto es Math.trunc(17 / 5)?
2. ¿Cuánto es 17 % 5?
3. ¿Cuánto es 17 / 5 en JavaScript?
4. ¿Qué da Math.trunc(9.99)?
5. ¿Qué imprime console.log("Suma: " + 2 + 3)?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·