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.
fonte
2009-10-22 09:04:02
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