2012-12-16 16 views
38

Ho un oggetto BigDecimal e voglio convertirlo in stringa. Il problema è che il mio valore ottenuto frazione e ottengo un numero enorme (in lunghezza) e ho solo bisogno il numero originale nella stringa, ad esempio: perBigDecimal to string

BigDecimal bd = new BigDecimal(10.0001) 
System.out.println(bd.toString()); 
System.out.println(bd.toPlainString()); 

l'output è:

10.000099999999999766941982670687139034271240234375 
10.000099999999999766941982670687139034271240234375 

e ho bisogno del fuori messo di essere esattamente il numero 10.0001 nella stringa

risposta

81

per ottenere esattamente 10.0001 è necessario utilizzare il costruttore String o valueOf (che costruisce un BigDecimal basata sulla rappresentazione canonica del doppio):

BigDecimal bd = new BigDecimal("10.0001"); 
System.out.println(bd.toString()); // prints 10.0001 
//or alternatively 
BigDecimal bd = BigDecimal.valueOf(10.0001); 
System.out.println(bd.toString()); // prints 10.0001 

Il problema con new BigDecimal(10.0001) è che l'argomento è un double e succede che raddoppia non possono rappresentare 10.0001 esattamente. Quindi, 10.0001 viene "trasformato" nel doppio più vicino possibile, ovvero 10.000099999999999766941982670687139034271240234375 e questo è ciò che mostra il tuo BigDecimal.

Per questo motivo, raramente ha senso utilizzare il doppio costruttore.

Si può leggere di più su di esso qui, Moving decimal places over in a double

+0

Un modo più efficiente convertire un 'double' in questo modo è usare' BigDecimal.valueOf (double); ' –

+0

@PeterLawrey Non sono sicuro di aver capito. 'BigDecimal.valueOf (double)' "arrotonda" il doppio nello stesso modo in cui il double viene arrotondato quando viene stampato, che usa regole un po 'complesse quindi non sono sicuro di come si possa fare affidamento su questo. – assylias

+0

'Traduce un doppio in un BigDecimal, usando la rappresentazione di stringa canonica del doppio fornita dal metodo Double.toString (double). Nota: Questo è generalmente il modo migliore per convertire un doppio (o galleggiante) in un BigDecimal, come il valore restituito è uguale a quello risultante dalla costruzione di un BigDecimal dal risultato dell'utilizzo di Double.toString (doppia) .' –

8

tuo BigDecimal non contiene il numero 10.0001, perché è stata inizializzata con un double, e il double non l'hai fatto abbastanza contenere il numero che si pensano che fatto. (Questo è il punto centrale di BigDecimal.)

Se si utilizza invece the string-based constructor:

BigDecimal bd = new BigDecimal("10.0001"); 

... allora sarà in realtà conterrà il numero che ci si aspetta.

0

Il BigDecimal non può essere un doppio. puoi usare il numero Int. se si desidera visualizzare esattamente il proprio numero, è possibile utilizzare il costruttore String di BigDecimal.

come questo:

BigDecimal bd1 = new BigDecimal("10.0001"); 

ora, è possibile visualizzare BD1 come 10,0001

così semplice. BUONA FORTUNA.

5

Utilizzando il metodo seguente è possibile convertire java.math.BigDecimal in String.

BigDecimal bigDecimal = new BigDecimal("10.0001"); 
    String bigDecimalString = String.valueOf(bigDecimal.doubleValue()); 
    System.out.println("bigDecimal value in String: "+bigDecimalString); 

uscita:
valore BigDecimal in Stringa: 10.0001

1
// Convert BigDecimal number To String by using below method // 

public static String RemoveTrailingZeros(BigDecimal tempDecimal) 
{ 
    tempDecimal = tempDecimal.stripTrailingZeros(); 
    String tempString = tempDecimal.toPlainString(); 
    return tempString; 
} 

// Recall RemoveTrailingZeros 
BigDecimal output = new BigDecimal(0); 
String str = RemoveTrailingZeros(output); 
0

per archiviare il risultato necessario con il doppio costruttore è necessario arrotondare il BigDecimal prima di convertirlo in stringa per esempio

nuovo java.math.BigDecimal (10,0001) .round (nuova java.math.MathContext (6, java.math.RoundingMode.HALF_UP)). ToString()

stamperà il "10,0001"

0

per un miglior supporto diversi locali usano in questo modo:

DecimalFormat df = new DecimalFormat(); 
df.setMaximumFractionDigits(2); 
df.setMinimumFractionDigits(0); 
df.setGroupingUsed(false); 

df.format(bigDecimal); 

inoltre è possibile personalizzare:

DecimalFormat df = new DecimalFormat("###,###,###"); 
df.format(bigDecimal);