Saltar al contenido

Extrayendo la parte entera y fraccionaria de Bigdecimal en Java

La guía o código que hallarás en este artículo es la solución más eficiente y efectiva que hallamos a esta duda o dilema.

Solución:

La representación de punto flotante de -1.30 no es exacta. Aquí hay una ligera modificación de su código:

BigDecimal bd = new BigDecimal("-1.30").setScale(2, RoundingMode.HALF_UP);
String textBD = bd.toPlainString();
System.out.println("text version, length = <" + textBD + ">, " + textBD.length());
int radixLoc = textBD.indexOf('.');
System.out.println("Fraction " + textBD.substring(0, radixLoc)
    + ". Cents: " + textBD.substring(radixLoc + 1, textBD.length()));

He puesto un modo de redondeo en setScale para redondear centavos fraccionarios como 1,295 “la mitad” a 1,30.

Los resultados son:

text version, length = <-1.30>, 5
Fraction -1. Cents: 30

Si desea no involucrarse con Strings (que creo que no es una buena práctica, excepto la parte de crear BigDecimal), puede hacerlo solo con Math:

// [1] Creating and rounding (just like GriffeyDog suggested) so you can sure scale are 2
BigDecimal bd = new BigDecimal("-1.30").setScale(2, RoundingMode.HALF_UP);

// [2] Fraction part (0.30)
BigDecimal fraction = bd.remainder(BigDecimal.ONE);

// [3] Fraction as integer - move the decimal.
BigDecimal fraction2 = fraction.movePointRight(bd.scale());

// [4] And the Integer part can result of:
BigDecimal natural = bd.subtract(fraction);

// [5] Since the fraction part of 'natural' is just Zeros, you can setScale(0) without worry about rounding
natural = natural.setScale(0);

Lo sé, mi inglés es terrible. Siéntete libre de corregir si puedes entender lo que traté de decir. Gracias.

Si conservas alguna perplejidad o disposición de regenerar nuestro reseña te insinuamos escribir un exégesis y con placer lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 5 Promedio: 4.2)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *