5

Tengo el siguiente código.

BigDecimal num = new BigDecimal(3.2);
System.out.println(num);

Esperado:

3.2

Salida.

3.20000000000000017763568394002504646778106689453125

Por lo tanto.

BigDecimal num = new BigDecimal(3.2);
BigDecimal num1 = new BigDecimal(2);
System.out.println(num.add(num1));

Esperado:

5.2

Salida.

5.20000000000000017763568394002504646778106689453125

No entiendo como se deben realizar cálculos con operaciones básicas en Java, no se si existe otra librería u otra forma de realizar esto.

Ricardo
  • 233
  • 1
  • 7
  • @CarlosMuñoz no es un duplicado exacto. – rnrneverdies Feb 16 '16 at 23:05
  • @CarlosMuñoz ahora que leo mejor la pregunta que marcas como duplicado, el problema de `@JordiCadilla` era sobre el redondeo, y nadie en sus respuestas apunta a eso. –  Feb 16 '16 at 23:08
  • Al @CarlosMuñoz verdadero. alguien esta usando tu cuenta por ti, jaja – rnrneverdies Feb 16 '16 at 23:09
  • Cierto, ya retiré el voto de cierre, y la respuesta de @LuiggiMendoza es la correcta. – Carlos Muñoz Feb 16 '16 at 23:11
  • @CarlosMuñoz agregué una respuesta adicional sobre la pregunta que colocaste como duplicado, apuntando al tema del redondeo. –  Feb 16 '16 at 23:24

1 Answers1

7

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: