BigDecimal
es la clase que ofrece el JDK de Java para trabajar con números decimales de manera más exacta. El problema que tienes surge porque estás inicializando tus instancias de BigDecimal
utilizando double
, y este último sufre del problema clásico de operaciones de punto flotante. Este problema se explica con más detalle en esta pregunta y sus respuestas.
En Java, para que puedas utilizar el potencial de BigDecimal
al utilizar números decimales, debes utilizar el constructor que recibe una cadena de texto:
BigDecimal num = new BigDecimal("3.2");
En caso que estés inicializando una variable BigDecimal
con un double
porque no tienes otra salida p.e. cuando utilizas Apache POI y obtienes el valor numérico de una celda, entonces lo que debes hacer es redondear el valor de tu número a un número fijo de decimales:
double d = 3.2;
BigDecimal num = new BigDecimal(d).setScale(1, RoundingMode.HALF_EVEN);
Cuando utilizas int
(entero) o long
(entero largo), no hay ningún problema al inicializar tu variable:
BigDecimal num2 = new BigDecimal(2);
Relacionados: