La clase BigDecimal

Bien, creo que una de las cosas mas importantes es utilizar números grandes y precisos en sumas, restas, multiplicaciones y en especial divisiones. La clase BigDecimal nos permite manejar miles y millones de cantidades, podemos tomar cualquier valor numérico exacto sin problemas, y explico el porque:

   El orden de las clases numéricas va así: byte > short > int > long > float > double, siendo esta última la que mas caracteres posee y la que mayor rango abarca, pero ¿que pasa al utilizar operaciones aritméticas de precisión mas elevada?, por ejemplo, hagamos lo siguiente:

double decima=0.01;
double total=decima+decima+decima+decima+decima+decima;
System.out.println(total);

   El resultado será 0.060000000000000005, ¿y porqué?, simple, las computadoras cuentan en binario.... Para mas info de esto esta wikipedia y la documentación.

   Sabiendo esto probemos con la clase BigDecimal, para hacer la suma utilizamos ".add(valor)":
BigDecimal decima = new BigDecimal("0.01");
BigDecimal total=decima.add(decima).add(decima).add(decima).add(decima).add(decima);
System.out.println(total);

   Esta vez el resultado si es "0.06". El paquete es "java.Math.BigDecimal", es allí donde se encuentra nuestra clase para manejar "n" cantidad de dígitos en nuestros programas, ahora unos pequeños tips.... Para limitar a "x" decimales utilizamos "setScale()"
BigDecimal x = new BigDecimal(numero).setScale(cantidad_de_decimales);

   Para redondearlo completamente primero limitamos y luego elegimos el tipo de redondeo, por ejemplo:
BigDecimal x = new BigDecimal(numero).setScale(cantidad_de_decimales,redondeo);

   Para redondear el número que nos devuelve la clase utilizamos "RoundingMode.OPCION", las opciones son:

  • CEILING: para redondear un valor positivo adicional (0.437 = 4.44).
  • FLOOR: para redondear con tendencia a infinito negativo.
  • UP: para redondear mayor a cero(0.405 = 0.41).
  • DOWN: para redondear a cero(0.405 = 0.40).
  • HALF_DOWN: para redondear en tendencia al menor (0.470 = 0.45).
  • HALF_UP: para redondear en tendencia al mayor (0.470 = 0.50).
  • HALF_EVEN: para redondear en tendencia al mas cercano (0.42 = 0.40).
  • UNNECESSARY: para redondear en caso de que no sea exacto el valor(no redondea).

   Y por último, si no vamos a utilizar grandes cantidades numéricas o de poca precisión aritmética, recomiendo trabajar con "double" o "float", utilicemos esto solo en caso de ser necesario, es solo una recomendación...


3 Comentarios

Escribir Comentario
Unknown
AUTOR
15 de mayo de 2018, 23:32 delete

Explica mejor lo de los modos de redondeo, porque así pareciera que trabajan de la misma manera, más ejemplos

Responder
avatar

Lamentablemente hay muchos usuarios en la red que han llegado al blog para escribir obscenidades, así que la moderación se hace necesaria. Recuerda utilizar un lenguaje correcto y espera a que sea aprobado.

Si necesitas publicar código haz click en "Conversión" para hacerlo legible.
ConversiónConversión