2012-04-30 12 views
7

Come estrarre un numero dopo il punto decimale utilizzando BigDecimal?Numero decimale estratto in BigDecimal

BigDecimal d = BigDecimal.valueOf (1548.5649);

risultato: estratto solo: 5649

+2

Nota: Si dovrebbe usare 'BigDecimal.valueOf ("1548,5649");', invece, perché la conversione tra 'double' e 'BigDecimal' può causare strani effetti collaterali. Se hai bisogno di precisione, evita 'double' e' float'. –

+1

@AaronDigulla Penso che tu intenda il nuovo BigDecimal ("1548.5649") perché non esiste un metodo BigDecimal.valueOf (String). –

risposta

10

provare:

BigDecimal d = BigDecimal.valueOf(1548.5649); 
BigDecimal result = d.subtract(d.setScale(0, RoundingMode.FLOOR)).movePointRight(d.scale());  
System.out.println(result); 

stampe:

5649 
6

Prova BigDecimal.remainder:

BigDecimal d = BigDecimal.valueOf(1548.5649); 
BigDecimal fraction = d.remainder(BigDecimal.ONE); 
System.out.println(fraction); 
// Outputs 0.5649 
+0

è display: 1548.564900000000079671735875308513641357421875 – Mehdi

+1

Visualizza '0.5649' per me. –

+0

Sì, è vero :) Grazie;) – Mehdi

4

Questo dovrebbe fare il trucco:

d.subtract(d.setScale(0, RoundingMode.FLOOR)); 

setScale() arrotonda il numero a zero cifre decimali, e nonostante il suo nome non muta il valore di d.

+0

È lavoro ... grazie :) – Mehdi

-1

tenta di utilizzare d.doubleValue() per ottenere il valore doppio

+2

restituisce lo stesso numero: 1548.5649 – Mehdi

0

Non dire quale tipo si desidera come un risultato. Il modo più semplice è probabilmente quello di trasformare il BigDecimal in una stringa, e prendere una stringa:

String s = d.toPlainString(); 
int i = s.indexOf('.'); 
if (i < 0) { 
    return ""; 
} 
return s.substring(i + 1); 
+0

Funziona solo per un Locale che utilizza. come separatore decimale. Ma ci sono localizzazioni che stanno usando,. – BetaRide

+0

@BetaRide: lo so, parlo francese e qui viene usata la virgola. Ma BigDecimal.toPlainString() non è consapevole delle impostazioni internazionali. Usa il punto come separatore decimale qualunque sia la localizzazione. –

1

Se il valore è negativo, utilizzando d.subtract(d.setScale(0, RoundingMode.FLOOR)) restituirà un decimale errato.

Utilizzare questa:

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

Esso restituisce 5649 per 1548.5649 o -1548.5649