🔢 ¿Qué son los operadores aritméticos?
Los operadores aritméticos son símbolos que permiten realizar las operaciones matemáticas fundamentales sobre datos numéricos dentro de un programa: suma, resta, multiplicación, división y cálculo del resto. Junto con los operadores de asignación, son los primeros que cualquier programador aprende a utilizar y constituyen la base de todo cálculo computacional.
En Java —y en la mayoría de los lenguajes de programación— los operadores aritméticos se dividen en dos grandes grupos según el número de operandos que requieren:
| Categoría | Operandos | Ejemplos |
|---|---|---|
| Unarios | Un solo operando | Signo positivo (+x), signo negativo (-x), incremento (++x), decremento (--x) |
| Binarios | Dos operandos | Suma (a + b), resta (a - b), multiplicación (a * b), división (a / b), módulo (a % b) |
- es unario en -5 y binario en 10 - 5.➕ Operadores aritméticos unarios
Los operadores unarios se aplican a un solo operando. En Java existen cuatro operadores aritméticos unarios:
| Operador | Símbolo | Descripción | Ejemplo | Resultado |
|---|---|---|---|---|
| Signo positivo | + |
Indica valor positivo (rara vez se escribe de forma explícita) | +7 |
7 |
| Signo negativo | - |
Invierte el signo del operando | -4 |
-4 |
| Incremento | ++ |
Suma 1 al operando | ++x / x++ |
x + 1 |
| Decremento | -- |
Resta 1 al operando | --x / x-- |
x − 1 |
🔹 El operador de signo negativo
El operador - cuando se antepone a una expresión devuelve su valor con el signo cambiado. Si el operando ya es negativo, el resultado es positivo:
int a = 4; int b = -a; // b vale -4 int c = -b; // c vale 4 (doble negación) int d = -(-10); // d vale 10
🧮 Operadores aritméticos binarios
Los operadores binarios trabajan con dos operandos y producen un resultado numérico. Son los más utilizados en cualquier programa:
| Operador | Símbolo | Descripción | Ejemplo | Resultado |
|---|---|---|---|---|
| Suma | + |
Suma dos valores numéricos | 8 + 3 |
11 |
| Resta | - |
Resta el segundo del primero | 8 - 3 |
5 |
| Multiplicación | * |
Multiplica dos valores | 8 * 3 |
24 |
| División | / |
Divide el primero entre el segundo | 8 / 3 |
2 (entero) |
| Módulo (resto) | % |
Devuelve el resto de la división entera | 8 % 3 |
2 |
▶️ Ejemplo práctico con todos los operadores
public class OperadoresBinarios { public static void main(String[] args) { int a = 17; int b = 5; System.out.println("Suma: " + (a + b)); // 22 System.out.println("Resta: " + (a - b)); // 12 System.out.println("Multiplicación: " + (a * b)); // 85 System.out.println("División entera: " + (a / b)); // 3 System.out.println("Módulo (resto): " + (a % b)); // 2 } }
a == (a / b) * b + (a % b). En el ejemplo: 17 == 3 * 5 + 2. Esta identidad es útil para verificar cálculos y comprender la relación entre ambos operadores.➗ División entera vs. división real
Uno de los aspectos que más confusión genera entre principiantes es que el operador / se comporta de forma distinta según el tipo de los operandos:
| Tipo de operandos | Comportamiento | Ejemplo | Resultado |
|---|---|---|---|
Ambos enteros (int, long) |
División entera: trunca la parte decimal | 7 / 2 |
3 |
Al menos uno real (double, float) |
División real: conserva decimales | 7.0 / 2 |
3.5 |
▶️ Comparación práctica
public class DivisionEntreaYReal { public static void main(String[] args) { int a = 7, b = 2; // División entera: ambos operandos son int System.out.println("7 / 2 = " + (a / b)); // 3 // División real: al menos un operando es double System.out.println("7.0 / 2 = " + (7.0 / b)); // 3.5 // Forzar división real con casting System.out.println("(double)7 / 2 = " + ((double) a / b)); // 3.5 // Error frecuente: casting al resultado (ya truncado) System.out.println("(double)(7 / 2)= " + ((double) (a / b))); // 3.0 } }
(double)(7 / 2) primero calcula 7 / 2 = 3 (división entera) y luego convierte 3 a 3.0. Para obtener el resultado correcto hay que hacer el casting antes de la división: (double)7 / 2.🔹 División por cero
La división por cero tiene consecuencias diferentes según el tipo de datos:
public class DivisionPorCero { public static void main(String[] args) { // Con enteros: ArithmeticException // int x = 10 / 0; ← Lanza java.lang.ArithmeticException // Con punto flotante: valores especiales IEEE 754 System.out.println(10.0 / 0); // Infinity System.out.println(-10.0 / 0); // -Infinity System.out.println(0.0 / 0); // NaN (Not a Number) } }
🔄 El operador módulo (%)
El operador % devuelve el resto de la división entera entre dos números. Es uno de los operadores más versátiles y se utiliza con frecuencia para resolver problemas clásicos de programación.
🔹 Usos habituales del módulo
| Uso | Código | Descripción |
|---|---|---|
| Comprobar paridad | n % 2 == 0 |
true si n es par |
| Comprobar divisibilidad | n % d == 0 |
true si n es divisible por d |
| Índice circular | i % longitud |
Vuelve al inicio cuando i supera el tamaño de un array |
| Extraer dígitos | n % 10 |
Obtiene el último dígito de n |
▶️ Ejemplo: clasificar números pares e impares
public class ParidadNumeros { public static void main(String[] args) { for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { System.out.println(i + " es par"); } else { System.out.println(i + " es impar"); } } } }
🔹 Módulo con números negativos
En Java, el signo del resultado del operador % coincide con el signo del dividendo (primer operando):
System.out.println( 7 % 3); // 1 (positivo porque 7 es positivo) System.out.println(-7 % 3); // -1 (negativo porque -7 es negativo) System.out.println( 7 % -3); // 1 (positivo porque 7 es positivo) System.out.println(-7 % -3); // -1 (negativo porque -7 es negativo)
🔼 Incremento (++) y decremento (--)
Los operadores ++ y -- son atajos para sumar o restar 1 a una variable. Existen en dos formas que se comportan de manera distinta cuando se usan dentro de una expresión:
| Forma | Sintaxis | Comportamiento |
|---|---|---|
| Prefija | ++x / --x |
Incrementa (o decrementa) primero y devuelve el nuevo valor |
| Postfija | x++ / x-- |
Devuelve el valor original y luego incrementa (o decrementa) |
▶️ Diferencia entre prefijo y postfijo
public class IncrementoDecremento { public static void main(String[] args) { int x = 5; // Postfijo: usa el valor actual y DESPUÉS incrementa int a = x++; // a = 5, x = 6 System.out.println("a = " + a + ", x = " + x); // Prefijo: incrementa PRIMERO y luego usa el valor int b = ++x; // x = 7, b = 7 System.out.println("b = " + b + ", x = " + x); // Decremento postfijo int c = x--; // c = 7, x = 6 System.out.println("c = " + c + ", x = " + x); } }
i++ por convención, ya que es la forma más habitual en Java (especialmente en bucles for).📊 Precedencia y asociatividad
Cuando una expresión contiene varios operadores, Java los evalúa siguiendo un orden de precedencia (prioridad) y, para operadores del mismo nivel, una regla de asociatividad (izquierda a derecha o derecha a izquierda):
| Prioridad | Operadores | Tipo | Asociatividad |
|---|---|---|---|
| 1 (más alta) | ++ -- + (unario) - (unario) |
Unarios | Derecha → izquierda |
| 2 | * / % |
Multiplicativos | Izquierda → derecha |
| 3 (más baja) | + - |
Aditivos | Izquierda → derecha |
▶️ Ejemplo de evaluación paso a paso
int resultado = 2 + 3 * 4 - 6 / 2; // Paso 1: multiplicación y división (prioridad 2, izq → der) // 3 * 4 = 12 // 6 / 2 = 3 // Paso 2: suma y resta (prioridad 3, izq → der) // 2 + 12 - 3 = 11 System.out.println(resultado); // 11
() para hacer explícita la intención. Mejoran la legibilidad y evitan errores sutiles: int r = (2 + 3) * (4 - 6) / 2;.🔀 Promoción de tipos en operaciones
Cuando los operandos de una expresión aritmética tienen tipos diferentes, Java aplica reglas de promoción automática antes de realizar el cálculo:
| Regla | Descripción |
|---|---|
| 1 | byte y short se promueven siempre a int antes de cualquier operación. |
| 2 | Si un operando es double, el otro se promueve a double. |
| 3 | Si no hay double pero hay float, el otro se promueve a float. |
| 4 | Si no hay flotantes pero hay long, el otro se promueve a long. |
▶️ Ejemplo de promoción en acción
public class PromocionTipos { public static void main(String[] args) { byte x = 10; byte y = 20; // byte suma = x + y; ← ERROR: x + y produce int int suma = x + y; // Correcto: resultado es int byte sumaB = (byte)(x + y); // Correcto: casting explícito int entero = 5; double real = 2.5; double mezcla = entero + real; // 5 se promueve a 5.0 → 7.5 System.out.println("suma = " + suma); // 30 System.out.println("mezcla = " + mezcla); // 7.5 } }
byte a una variable byte sin casting provoca «possible lossy conversion from int to byte». Esto se debe a que Java promueve ambos a int antes de sumar.🔗 El operador + con cadenas
En Java, el operador + tiene un doble propósito: cuando al menos uno de los operandos es un String, actúa como operador de concatenación en lugar de realizar una suma aritmética.
🔹 Reglas de concatenación
public class ConcatenacionStrings { public static void main(String[] args) { // Concatenación básica String saludo = "Hola" + " " + "mundo"; System.out.println(saludo); // Hola mundo // Número + String = concatenación System.out.println("Edad: " + 25); // Edad: 25 // Cuidado con el orden de evaluación System.out.println(3 + 4 + " gatos"); // 7 gatos (suma primero) System.out.println("gatos " + 3 + 4); // gatos 34 (concatena todo) // Usar paréntesis para forzar la suma System.out.println("gatos " + (3 + 4)); // gatos 7 } }
3 + 4 + " gatos" primero suma 3 + 4 = 7 (ambos int) y luego concatena "7" + " gatos". En cambio, "gatos " + 3 + 4 concatena desde el primer operando String, produciendo "gatos 34".🚫 Errores frecuentes
Escribir
double promedio = 7 / 2; asigna 3.0 en lugar de 3.5, porque Java realiza la división entre enteros antes de asignar. Solución: Hacer al menos un operando double: double promedio = 7.0 / 2;.Si el divisor proviene de una entrada de usuario o un cálculo, puede ser cero. Solución: Verificar siempre con
if (divisor != 0) antes de dividir.System.out.println("Total: " + 3 + 4) imprime Total: 34 en vez de Total: 7. Solución: Usar paréntesis: "Total: " + (3 + 4).Si el resultado de una operación supera el rango del tipo, el valor «da la vuelta» sin generar error. Por ejemplo,
Integer.MAX_VALUE + 1 produce -2147483648. Solución: Usar long para cálculos grandes o Math.addExact() para detectar desbordamiento.==Debido a la imprecisión de la aritmética de punto flotante,
0.1 + 0.2 == 0.3 devuelve false. Solución: Comparar con un margen de tolerancia: Math.abs(a - b) < 1e-9, o usar BigDecimal para precisión exacta.🏗️ Ejemplo completo integrador
El siguiente programa simula un conversor de unidades de tiempo que recibe un número de segundos y lo descompone en horas, minutos y segundos restantes, utilizando división entera y módulo:
public class ConversorTiempo { // Constantes de conversión private static final int SEGUNDOS_POR_MINUTO = 60; private static final int SEGUNDOS_POR_HORA = 3600; public static void main(String[] args) { int totalSegundos = 45296; // Descomposición con división entera y módulo int horas = totalSegundos / SEGUNDOS_POR_HORA; int restante = totalSegundos % SEGUNDOS_POR_HORA; int minutos = restante / SEGUNDOS_POR_MINUTO; int segundos = restante % SEGUNDOS_POR_MINUTO; // Verificación: reconstruir el total int verificacion = horas * SEGUNDOS_POR_HORA + minutos * SEGUNDOS_POR_MINUTO + segundos; System.out.println("Total segundos: " + totalSegundos); System.out.println("Equivale a: " + horas + "h " + minutos + "m " + segundos + "s"); System.out.println("Verificación: " + verificacion); } } // Salida: // Total segundos: 45296 // Equivale a: 12h 34m 56s // Verificación: 45296
/ + % es el patrón clásico para descomponer una cantidad en unidades mayores. Funciona igual para convertir céntimos en euros, pulgadas en pies, bytes en kilobytes, etc.Ampliemos el ejemplo añadiendo un segundo conversor que calcula el desglose de una cantidad de dinero en billetes y monedas:
public class DesgloseDinero { public static void main(String[] args) { int centimos = 4873; // 48.73 € int euros = centimos / 100; int restoCent = centimos % 100; // Desglose de euros en billetes int billetes20 = euros / 20; int restoEuros = euros % 20; int billetes10 = restoEuros / 10; int billetes5 = (restoEuros % 10) / 5; int monedas1 = (restoEuros % 10) % 5; System.out.println("Cantidad: " + euros + "," + restoCent + " €"); System.out.println("Billetes de 20: " + billetes20); System.out.println("Billetes de 10: " + billetes10); System.out.println("Billetes de 5: " + billetes5); System.out.println("Monedas de 1: " + monedas1); } } // Salida: // Cantidad: 48,73 € // Billetes de 20: 2 // Billetes de 10: 0 // Billetes de 5: 1 // Monedas de 1: 3
📝 Ejercicios prácticos
Ejercicio 1: Comprensión — ¿Qué imprime este código?
Analiza el siguiente código y determina la salida por consola sin ejecutarlo:
public class EjercicioUno { public static void main(String[] args) { int a = 10, b = 3; System.out.println(a / b); System.out.println(a % b); System.out.println(a / b * b + a % b); System.out.println("Resultado: " + a + b); System.out.println("Resultado: " + (a + b)); } }
Ejercicio 2: Aplicación — Conversor de temperatura
Escribe un programa que convierta una temperatura de grados Celsius a Fahrenheit y viceversa. Las fórmulas son:
- Celsius → Fahrenheit:
F = C * 9 / 5 + 32 - Fahrenheit → Celsius:
C = (F - 32) * 5 / 9
El programa debe mostrar ambas conversiones para al menos tres temperaturas distintas y usar división double para mantener la precisión.
Ejercicio 3: Diseño — Calculadora de notas
Diseña un programa que, dado un array de calificaciones enteras (de 0 a 10), calcule e imprima:
- La suma de todas las notas.
- La media aritmética con dos decimales de precisión.
- La nota máxima y la mínima.
- El número de aprobados (nota >= 5) y suspensos.
❓ Preguntas frecuentes sobre Operadores aritméticos en programación
Las dudas más comunes respondidas de forma clara y directa.
💬 Foro de discusión
¿Tienes dudas sobre Operadores aritméticos en programación? Comparte tu pregunta con la comunidad.
Todavía no hay mensajes. ¡Sé el primero en participar!