2012-04-06 31 views
44

En Java, estoy trabajando con la clase BigDecimal y parte de mi código requiere que extraiga la parte fraccionaria de la misma. BigDecimal no parece tener ningún método incorporado para ayudarme a obtener el número después del punto decimal de BigDecimal.Java, extraer solo la parte fraccional de un BigDecimal?

Por ejemplo:

BigDecimal bd = new BigDecimal("23452.4523434"); 

I desea extraer los 4523434 a partir del número representado anteriormente. ¿Cuál es la mejor manera de hacerlo?

Respuesta

67

Lo intentaría bd.remainder(BigDecimal.ONE).

Utiliza el método remainder y la constante ONE.

BigDecimal bd = new BigDecimal("23452.4523434"); 
BigDecimal fractionalPart = bd.remainder(BigDecimal.ONE); // Result: 0.4523434 
+10

@Franklin - por favor, no acepte mi respuesta y acepte la respuesta de Taymon, ya que es más limpio y en general mejor que el mío. 1+ a Taymon. –

+6

El código de la solución actual devolvería "0.4523434", no "4523434" como deseaba el autor. Se necesitarán algunos movimientos más. –

+1

es importante obtener solo el "4523434" en algunos casos, esta respuesta no arroja el resultado correcto, también debe imprimir la salida. –

7

Aquí es una alternativa al uso del remainder() método:

BigDecimal bd = new BigDecimal("23452.4523434"); 
BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger())); 

Además, puede probar el método abs() para asegurar la parte fraccionaria es positivo:

BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger())).abs(); 
+0

Mucho mejor que el código de método "residuo" complejo – marcolopes

+0

Restar sin contexto matemático puede dar lugar a algunos resultados interesantes. – Ishmael

+0

No extrae solo "4523434", esta no es la respuesta correcta –

5

Si el el valor es negativo, usando bd.subtract() devolverá un decimal incorrecto.

Utilice esta:

BigInteger decimal = 
       bd.remainder(BigDecimal.ONE).movePointRight(bd.scale()).abs().toBigInteger(); 

Devuelve 4523434 para 23452.4523434 o -23452.4523434


Además, si usted no quiere ceros adicionales a la derecha de la parte fraccionaria, el uso :

bd = bd.stripTrailingZeros(); 

antes del código anterior.

+0

Si bien su código es correcto formalmente, no es en realidad. Imagine que la entrada es 'BigDecimal (" 123.45 "). SetScale (6)' luego obtendrá '450000'. Difícilmente un resultado útil. –

+0

@PavelVlasov ese número seguirá siendo parte fraccionaria, que es la pregunta original. Cada cero a la derecha de "parte fraccionaria" es inútil, por lo que '45' o' 450000' son iguales en este contexto. – IvanRF

+1

@PavelVlasov para resolver su caso, aplique 'bd = bd.stripTrailingZeros();' antes de mi código. – IvanRF

2

Esto devuelve "4523434", incluso si establece el número en negativo "-23452.4523434".

BigDecimal d = BigDecimal.valueOf(23452.4523434); 
BigInteger decimal = d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger();