Operadores aritméticos en programación

📅 Actualizado en marzo 2026 ✍️ Ángel López ⏱️ 15 min de lectura ✓ Nivel principiante ★ ★ ★ ★ ★ (5/5)

🔢 ¿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)
💡
Concepto clave: Un operador unario actúa sobre un único valor; un operador binario actúa sobre dos. La misma notación puede representar operadores distintos según el contexto: el signo - 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
    }
}
💡
Relación entre división y módulo: Siempre se cumple que 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
    }
}
⚠️
Cuidado con el casting tardío: La expresión (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);
    }
}
Buena práctica: Cuando solo se necesita incrementar una variable sin usar su valor en la misma expresión, ambas formas son equivalentes. En ese caso se recomienda utilizar 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
Consejo profesional: Ante la duda, use paréntesis () 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
    }
}
⚠️
Error de compilación común: Asignar la suma de dos 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
    }
}
💡
Evaluación de izquierda a derecha: La expresión 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

⚠️
Error 1: División entera inesperada
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;.
⚠️
Error 2: No comprobar la división por cero
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.
⚠️
Error 3: Confundir concatenación con suma
System.out.println("Total: " + 3 + 4) imprime Total: 34 en vez de Total: 7. Solución: Usar paréntesis: "Total: " + (3 + 4).
⚠️
Error 4: Desbordamiento de enteros (overflow)
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.
⚠️
Error 5: Comparar flotantes con ==
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
💡
Patrón clave: La combinación / + % 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.

Si se divide un entero entre cero (por ejemplo, 10 / 0), Java lanza una excepción ArithmeticException en tiempo de ejecución. Sin embargo, si se divide un número de punto flotante entre cero (por ejemplo, 10.0 / 0), el resultado es Infinity o -Infinity según el signo del dividendo, y 0.0 / 0.0 produce NaN (Not a Number). Esta diferencia se debe a que los tipos flotantes siguen el estándar IEEE 754.
El operador / realiza la división y devuelve el cociente. El operador % (módulo) devuelve el resto de la división entera. Por ejemplo, 17 / 5 devuelve 3 (cociente entero) y 17 % 5 devuelve 2 (resto). Ambos son fundamentales: la división para cálculos proporcionales y el módulo para tareas como determinar si un número es par, controlar ciclos o distribuir elementos.
Ambos incrementan la variable en 1, pero difieren en cuándo devuelven el valor. La forma postfija (i++) devuelve el valor original y luego incrementa: si i vale 5, la expresión i++ devuelve 5 y después i pasa a valer 6. La forma prefija (++i) incrementa primero y luego devuelve el nuevo valor: ++i devuelve 6 directamente. La diferencia es relevante cuando el resultado se usa dentro de una expresión mayor o una asignación.
Los tipos float y double almacenan los números en formato binario IEEE 754, y ciertas fracciones decimales (como 0.1 y 0.2) no tienen representación binaria exacta, al igual que 1/3 no tiene representación decimal finita. El resultado de 0.1 + 0.2 es 0.30000000000000004. Para cálculos que exijan precisión decimal exacta (como operaciones monetarias) se debe usar la clase BigDecimal en lugar de double.
Cuando una operación aritmética mezcla operandos de distinto tipo, Java promueve automáticamente el operando de menor rango al tipo de mayor rango antes de realizar el cálculo. El orden de promoción es: byte → short → int → long → float → double. Además, byte y short siempre se promueven a int antes de cualquier operación. Por eso, la suma de dos byte produce un int y es necesario hacer casting explícito para asignar el resultado a una variable byte.
Valora este artículo

💬 Foro de discusión

¿Tienes dudas sobre Operadores aritméticos en programación? Comparte tu pregunta con la comunidad.

¿Tienes cuenta? o comenta como invitado ↓

Todavía no hay mensajes. ¡Sé el primero en participar!