Domanda

Comprendo che BigDecimal è la migliore pratica raccomandata per rappresentare i valori monetari in Java. Cosa usi? Esiste invece una libreria migliore che preferisci usare?

È stato utile?

Soluzione

BigDecimal fino in fondo. Ho sentito di alcune persone che creano le proprie classi Cash o Money che incapsulano un valore in contanti con la valuta, ma sotto la pelle è ancora un BigDecimal , probabilmente con Arrotondamento BigDecimal.ROUND_HALF_EVEN .

Modifica: mentre Don menziona in la sua risposta , ci sono progetti open source come timeandmoney , e mentre li applaudo per aver cercato di impedire agli sviluppatori di avere per reinventare la ruota, non ho abbastanza fiducia in una libreria pre-alfa per usarla in un ambiente di produzione. Inoltre, se cerchi sotto il cofano, vedrai usano anche BigDecimal .

Altri suggerimenti

Può essere utile per le persone che arrivano qui dai motori di ricerca conoscere JodaMoney: http: // www .joda.org / Joda-money / .

Non sto esprimendo la mia opinione qui, ma ci sono abbastanza buone argomentazioni contro BigDecimal che qualcuno dovrebbe probabilmente scartare:

http://lemnik.wordpress.com/2011 / 03/25 / BigDecimal-e-il-tuo-soldi /

Una comoda libreria che ho incontrato in precedenza è la Joda-Money . Una delle sue implementazioni si basa infatti su BigDecimal. Si basa sulla ISO-4217 per le valute e può supportare un elenco di valute personalizzato (caricato tramite CVS).

Questa libreria ha un numero limitato di file che è possibile passare rapidamente se sono necessarie modifiche. Joda-Money è pubblicato sotto la licenza Apache 2.0.

Se stai usando solo dollari e centesimi, userei un long (offset di 2 decimali). Se hai bisogno di maggiori dettagli, il grande decimale potrebbe essere la strada da percorrere.

Ad ogni modo, probabilmente estenderei la classe per avere un .toString () che usa il formato corretto e come un posto dove mettere altri metodi che potrebbero venire fuori (per molto tempo, moltiplicare e dividere andrà male se il decimale non viene modificato)

Inoltre, se usi definisci la tua classe e la tua interfaccia, puoi sostituire l'implementazione a piacimento.

BigDecimal o un'altra rappresentazione in virgola fissa è ciò che è generalmente necessario per denaro.

Rappresentazioni e calcoli in virgola mobile ( Double , Float ) sono inesatti, portando a risultati errati.

Devi stare molto attento quando hai a che fare con tempo e denaro.

Quando lavori con i soldi, spero che tutti dovrebbero sapere di non usare mai un float o un double.

Ma non sono sicuro di BigDecimal.

Nella maggior parte dei casi andrà bene se si tiene traccia dei centesimi in un int o lungo. In questo modo non hai mai a che fare con un decimale.

Visualizza i dollari solo quando lo stampi. Lavora sempre con centesimi interni usando numeri interi. Questo può essere complicato se è necessario dividere o utilizzare Math.abs ().

Tuttavia, potrebbe interessarti mezzo centesimo o anche un centesimo di centesimo. Non so quale sia un buon modo per farlo. Potrebbe essere solo necessario affrontare il millesimo di centesimi e utilizzare a lungo. O forse sarai costretto a usare BigDecimal

Vorrei leggere molto di più su questo, ma ignorerei tutti quelli che iniziano a parlare di usare un float o double per rappresentare denaro. Stanno solo chiedendo problemi.

Sento che il mio consiglio non è completo, quindi ti preghiamo di aggiungere altro. Hai a che fare con tipi pericolosi!

La creazione di una classe Money è la strada da percorrere. Utilizzando BigDecimal (o anche un int) sotto. Quindi utilizzare la classe Currency per definire la convenzione di arrotondamento.

Sfortunatamente senza l'overloading dell'operatore Java rende abbastanza spiacevole la creazione di tali tipi di base.

Esiste una libreria migliore, timeandmoney . IMO, è di gran lunga superiore alle librerie fornite dal JDK per rappresentare questi 2 concetti.

Sicuramente non BigDecimal. Ci sono così tante regole speciali per l'arrotondamento e la presentazione di cui devi preoccuparti.

Martin Fowler raccomanda l'implementazione di una classe Money dedicata per rappresentare gli importi in valuta e che implementa anche le regole per la conversione di valuta.

Ehi, ecco un articolo molto interessante su BigDecimal e un esempio illustrativo del perché a volte viene usato al posto del doppio. Tutorial BigDecimal .

È possibile utilizzare la classe DecimalFormat durante la visualizzazione di un valore di valuta. Fornisce supporto per la localizzazione ed è piuttosto estensibile.

Incapsulerei BigDecimal nella classe Money che ha anche una valuta come qualcuno menzionato sopra. L'importante è che tu esegua una quantità estrema di test unitari e soprattutto se lavori con valute diverse. Inoltre è una buona idea se aggiungi un costruttore comodo che accetta una stringa o un metodo factory che fa lo stesso in modo da poter scrivere i tuoi test in questo modo:

   assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));

Ci sono sempre vincoli e specifiche coinvolti. Chiunque non abbia esperienza sufficiente per apprezzare le sottili questioni delineate nel seguente articolo dovrebbe riconsiderare seriamente prima di occuparsi dei dati finanziari del mondo reale:

http://lemnik.wordpress.com/2011/ 25/03 / BigDecimal-e-il-tuo-soldi

BigDecimal non è quasi l'unica rappresentazione corretta o l'unico pezzo del puzzle. Date determinate condizioni, l'utilizzo di una classe Money supportata da centesimi archiviati come numero intero potrebbe essere sufficiente e sarebbe molto più veloce di BigDecimal. Sì, ciò implica l'uso di dollari come valuta e limiti di importo, ma tali vincoli sono perfettamente accettabili per molti casi d'uso e tutte le valute hanno comunque casi speciali di arrotondamento e sottotitoli, quindi non esiste un "universale". soluzione.

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