tipo di dati per rappresentare un grande decimale in Java
-
05-07-2019 - |
Domanda
Quale tipo di dati è adatto a rappresentare un numero decimale come " 10364055,81 " ;.
Se si tenta di utilizzare double:
double d = 10364055.81;
Ma quando provo a stampare il numero, viene visualizzato come " 1.036405581E7 " ;, che non desidero.
Dovrei usare BigDecimal? Ma viene visualizzato come 10364055.81000000052154064178466796875 . Esiste un tipo di dati che visualizza i valori così come sono? Inoltre, il numero potrebbe essere maggiore di quello preso come esempio.
A proposito, l'utilizzo di BigDecimal influirà sulle prestazioni dell'applicazione ?? Potrei usarlo in quasi tutti i miei DTO.
Soluzione
Dovresti usare BigDecimal, ma usa il costruttore di stringhe , ad esempio:
new BigDecimal("10364055.81");
Se passi un doppio
a BigDecimal, Java deve prima creare quel doppio - e poiché i doppi non possono rappresentare con precisione la maggior parte delle frazioni decimali, non crea il valore come
In generale, l'uso di costruttori non String di BigDecimal dovrebbe essere considerato un avvertimento che non stai ottenendo il massimo beneficio dalla classe.
Modifica - basato sulla rilettura esattamente di ciò che volevi fare, la mia affermazione iniziale è probabilmente troppo forte. BigDecimal è una buona scelta quando devi rappresentare esattamente i valori decimali (la gestione del denaro è la scelta ovvia, per esempio non vuoi 5,99 * un milione 5990016,45
.
Ma se non sei preoccupato che il numero venga memorizzato internamente come valore leggermente diverso dal letterale decimale che hai inserito, e vuoi solo stamparlo di nuovo nello stesso formato, allora come altri hanno già detto, un'istanza di NumberFormat
(in questo caso, new DecimalFormat (" ########. ## ")
) farà il trucco per produrre bene il doppio, oppure String.format può fare più o meno la stessa cosa.
Per quanto riguarda le prestazioni, i BigDecimals saranno naturalmente più lenti rispetto all'utilizzo delle primitive. In genere, tuttavia, a meno che la stragrande maggioranza del programma non comporti manipolazioni matematiche, è improbabile che si noti effettivamente alcuna differenza di velocità. Questo non vuol dire che dovresti usare BigDecimals dappertutto; ma piuttosto, se puoi trarre un vantaggio reale dalle loro caratteristiche che sarebbero difficili o impossibili da realizzare con i semplici doppi
, allora non sudare la minuscola differenza di prestazioni che teoricamente introducono.
Altri suggerimenti
La modalità di visualizzazione di un numero è distinta dalla modalità di memorizzazione del numero.
Dai un'occhiata a DecimalFormat per controllare come è possibile visualizzare i numeri quando si raddoppia (o float ecc.).
Nota che la scelta di BigDecimal rispetto al doppio (o viceversa) ha vantaggi / svantaggi e dipenderà dalle tue esigenze. Vedi qui per maggiori informazioni. Dal riassunto:
In breve, se prestazioni non elaborate e lo spazio sono i fattori più importanti, sono i tipi primitivi in ??virgola mobile adeguata. Se è necessario un valore decimale essere rappresentato esattamente, alta precisione è necessario il calcolo o un controllo accurato di arrotondamento è desiderato, solo BigDecimal ha il necessario funzionalità.
Un doppio sarebbe sufficiente per salvare questo numero. Se il tuo problema è che non ti piace il formato quando lo stampi o lo inserisci in una stringa, potresti usare NumberFormat: http://java.sun.com/javase/6/docs/api/java/text/NumberFormat.html
puoi usare double e display se con System.out.printf ().
double d = 100003.81;
System.out.printf("%.10f", d);
.10f - significa un doppio con precisione di 10