¿Cómo redondear un número a N decimales en Java? Análisis completo con ejemplos
El redondeo de números es una de esas tareas que enfrenta todo desarrollador Java, ya sea un principiante mostrando precios en consola o un ingeniero experimentado trabajando con cálculos financieros. Parecería que no podría ser más sencillo. Pero en la práctica, Java redondear double esconde no pocas trampas: desde "mágicos" errores de precisión hasta la elección de la herramienta correcta para cada tarea.
En este artículo analizaremos todas las formas principales de cómo redondear un número en Java a una cantidad determinada de decimales. Aprenderás cuándo usar Math.round, por qué Double es peligroso en cálculos financieros, y por qué BigDecimal es tu mejor amigo cuando se trata de dinero. ¡Allá vamos!
El problema: ¿por qué el simple redondeo en Java no siempre es simple?
Antes de pasar a las soluciones, entendamos la raíz del problema. El tipo double en Java (como en la mayoría de los lenguajes) almacena números de punto flotante en formato binario. Debido a esto, muchos decimales (por ejemplo, 0.1 o 0.2) no pueden representarse con exactitud. Intenta ejecutar:
System.out.println(0.1 + 0.2); // Mostrará 0.30000000000000004Para mostrar en pantalla puede no ser crítico, pero para cálculos es un desastre. Por lo tanto, Java redondear a 2 decimales (o cualquier otra cantidad) debe hacerse de forma consciente.
Método 1: Redondeo matemático con Math.round
La forma más directa es usar Math.round(). Redondea el número al entero más cercano. Para obtener N decimales, "desplazamos" el punto decimal, redondeamos y luego lo desplazamos de vuelta.
Ejemplo: redondear double a 2 decimales:
public static double roundWithMathRound(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale;}
// Usodouble number = 3.14159265;double rounded = roundWithMathRound(number, 2);System.out.println(rounded); // 3.14Ventajas: Simplicidad, sin dependencia de bibliotecas externas.
Desventajas: Funciona con double, por lo que aún está sujeto a errores de precisión en valores límite. No es adecuado para finanzas.
Método 2: Formateo con DecimalFormat
La clase DecimalFormat del paquete java.text permite no solo redondear, sino también formatear el número de forma elegante como cadena. Es ideal para interfaces de usuario e informes.
import java.text.DecimalFormat;
public static String formatWithDecimalFormat(double value, int places) { // Creamos la plantilla: #.00 para dos decimales StringBuilder pattern = new StringBuilder("#."); for (int i = 0; i < places; i++) { pattern.append("0"); } DecimalFormat df = new DecimalFormat(pattern.toString()); return df.format(value);}
// UsoString result = formatWithDecimalFormat(2.71828, 3);System.out.println(result); // 2.718También puedes configurar el modo de redondeo (RoundingMode):
df.setRoundingMode(RoundingMode.HALF_UP); // Redondeo matemático estándarImportante: DecimalFormat devuelve un String, no un número. Si necesitas un double para cálculos posteriores, este método no es adecuado.
Método 3: BigDecimal — el estándar de oro de la precisión
Cuando la precisión es crítica (finanzas, cálculos científicos), entra en escena BigDecimal. Permite controlar cada dígito y evitar los errores de double.
import java.math.BigDecimal;import java.math.RoundingMode;
public static BigDecimal roundWithBigDecimal(double value, int places) {\