Por qué no usar double para dinero
Problemas de precisión de coma flotante
Por qué no usar double para dinero es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.
Un valor predeterminado peligroso
Parece natural almacenar los precios en un double. Por desgracia, double no puede representar exactamente la mayoría de las fracciones decimales, lo que provoca pequeños errores que arruinan los cálculos financieros.
La sorpresa habitual
Si suma 0.1 y 0.2 con double, no obtiene 0.3. Obtiene un valor con un pequeño error de redondeo.
public class Main {
public static void main(String[] args) {
double result = 0.1 + 0.2;
System.out.println(result);
}
}Por qué ocurre
Los ordenadores almacenan double en binario. Del mismo modo que un tercio no se puede escribir exactamente en decimal, muchos decimales como 0.1 no se pueden escribir exactamente en binario.
Se almacena la aproximación binaria más cercana y el error se acumula.
Los errores se acumulan
Un único error pequeño puede parecer inofensivo, pero en un bucle que recorra miles de transacciones las diferencias se acumulan hasta convertirse en errores visibles.
public class Main {
public static void main(String[] args) {
double total = 0.0;
for (int i = 0; i < 10; i++) {
total += 0.1;
}
System.out.println(total);
}
}La igualdad falla
Debido a los errores de redondeo, comparar valores double calculados con == suele fallar cuando espera que sean iguales.
public class Main {
public static void main(String[] args) {
double a = 0.1 + 0.2;
double b = 0.3;
System.out.println(a == b);
}
}El dinero exige exactitud
En finanzas, un error de una fracción de céntimo es inaceptable. Los auditores esperan que los totales coincidan hasta el último céntimo.
Por eso, el dinero nunca debe almacenarse con un tipo de coma flotante.
La solución: BigDecimal
Java proporciona BigDecimal, una clase que almacena los números decimales exactamente. Realiza un seguimiento por separado del valor sin escala y de la escala, de modo que 0.1 significa realmente 0.1.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b));
}
}Use siempre el constructor de String
Cree un BigDecimal a partir de un String, no de un double. Pasar un double incorpora el error binario al BigDecimal.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal fromDouble = new BigDecimal(0.1);
BigDecimal fromString = new BigDecimal("0.1");
System.out.println(fromDouble);
System.out.println(fromString);
}
}O use valueOf
BigDecimal.valueOf es un atajo seguro. Convierte el double mediante su representación canónica como cadena, evitando el error binario original.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal price = BigDecimal.valueOf(19.99);
System.out.println(price);
}
}Almacenar el dinero en céntimos
Una alternativa para casos sencillos es almacenar el dinero como un número entero de céntimos usando long. Así, 19.99 dólares se convierten en 1999 céntimos y todas las operaciones son aritmética entera exacta.
public class Main {
public static void main(String[] args) {
long cents = 1999;
long total = cents * 3;
System.out.println(total + " cents");
}
}La conclusión
Use float y double en trabajos científicos y gráficos, donde los pequeños errores sean aceptables. Para el dinero y cualquier valor que deba ser exacto, use BigDecimal o céntimos enteros.
Comprobación rápida
Compruebe su comprensión de la precisión de la coma flotante.
Resumen
Ha aprendido por qué double falla al trabajar con dinero:
- La coma flotante binaria no puede almacenar muchos decimales exactamente
- Los errores, como que
0.1 + 0.2no sea igual a 0.3, se acumulan - Use
BigDecimalpara realizar aritmética decimal exacta - Créelo a partir de un String o con
valueOf, nunca a partir de un double sin más - Almacenar céntimos enteros es otra opción exacta
Preguntas frecuentes
¿La lección «Por qué no usar double para dinero» es gratis?
Sí — el texto completo de «Por qué no usar double para dinero» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Por qué no usar double para dinero»?
Problemas de precisión de coma flotante Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Java Academy?
No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Por qué no usar double para dinero»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Java Academy?
Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué no usar double para dinero
- Uso de BigDecimal
- Redondeo y escala
- BigInteger para números enormes