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.

È stato utile?

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 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'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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top