2009-10-22 16 views
5

Quale tipo di dati è adatto a rappresentare un numero decimale come "10364055.81".per rappresentare un grande decimale in java

Se ha provato doppia:

double d = 10364055.81; 

Ma quando provo a stampare il numero, la sua visualizzazione come "1.036405581E7", che io non voglio.

Devo utilizzare BigDecimal? Ma si visualizza come 10364055.81000000052154064178466796875. C'è qualche tipo di dati che visualizza i valori così come sono? Anche il numero può essere più grande di quello preso come esempio.

BTW, utilizzerà l'effetto BigDecimal le prestazioni dell'applicazione ?? Potrei usarlo in quasi tutti i miei DTO.

risposta

17

Si dovrebbe usare BigDecimal - ma utilizzare il costruttore String, ad esempio:

new BigDecimal("10364055.81"); 

Se si passa un double per BigDecimal, Java deve creare quel primo doppio - e dal momento che doppie non può rappresentare più decimale frazioni esattamente, è fa crea il valore come 10364055.81000000052154064178466796875 e quindi lo passa al costruttore BigDecimal. In questo caso, BigDecimal non ha modo di sapere che in realtà intendevi la versione più rotonda.

In generale, l'utilizzo di costruttori non String di BigDecimal deve essere considerato un avvertimento che non si ottiene il massimo beneficio dalla classe.

Modifica - basato sulla rilettura esatta di ciò che si voleva fare, la mia richiesta iniziale è probabilmente troppo forte. BigDecimal è una buona scelta quando devi rappresentare esattamente i valori decimali (la gestione del denaro è la scelta più ovvia, non vuoi che 5.99 * un milione sia 5990016.45 per esempio.

Ma se non siete preoccupati per il numero di essere memorizzati internamente come un valore molto leggermente diverso per il letterale decimale immesso, e vogliono solo stamparlo di nuovo nello stesso formato, poi come altri hanno detto , un'istanza di NumberFormat (in questo caso, new DecimalFormat("########.##")) eseguirà il trucco per generare correttamente il doppio, oppure String.format può fare la stessa cosa.

Per quanto riguarda le prestazioni - BigDecimals sarà naturalmente più lento rispetto all'utilizzo di primitive. In genere, tuttavia, a meno che la stragrande maggioranza del programma coinvolga manipolazioni matematiche, è improbabile che notiate effettivamente eventuali differenze di velocità. Questo non vuol dire che dovresti usare BigDecimals dappertutto; ma piuttosto, se si può ottenere un beneficio reale dalle loro caratteristiche che sarebbe difficile o impossibile da realizzare con il semplice doubles, quindi non sudare le minime differenze di prestazioni che teoricamente introducono.

+0

Beh, penso che tu abbia ragione. Ma un doppio tipo di dati deve essere sufficiente per quel numero (solo due decimali). L'uso di un BigDecimal in cui un double è sufficiente può causare un basso rendimento quando si eseguono alcune operazioni. – sinuhepop

3

Come viene visualizzato un numero è distinto da come il numero è memorizzato.

Dai uno sguardo allo DecimalFormat per controllare come puoi visualizzare i tuoi numeri quando un doppio (o galleggiante, ecc.).

Si noti che la scelta di BigDecimal su doppio (o viceversa) ha pro/contro, e dipenderà dalle vostre esigenze. Vedi here per maggiori informazioni. Dalla sintesi:

In sintesi, se le prestazioni crudo e spazio sono i fattori più importanti, tipi a virgola mobile primitive sono appropriate. Se i valori decimali devono rappresentare esattamente , è necessario il calcolo ad alta precisione oppure è necessario il controllo fine di arrotondamento, solo BigDecimal dispone delle funzionalità necessarie.

1

puoi usare doppio e visualizzare se con System.out.printf().

double d = 100003.81; 
System.out.printf("%.10f", d); 

.10f - significa una doppia con precisione di 10

Problemi correlati