2011-01-28 17 views
14

Quali sono le migliori pratiche nell'utilizzo del tipo di dati in denaro nell'applicazione Java? Il denaro dovrebbe essere in doppia variabile? Che dire di arrotondamenti, valute e così via. Sono librerie speciali per questo? E che dire di ORM e SQL nei database più popolari. Come so non in tutti i motori SQL è il tipo di dati di denaro. In tal caso, è necessario utilizzare NUMERIC(15,2), DECIMAL(15,2) o il tipo di dati REAL?Come utilizzare il tipo di dati in denaro in Java, SQL, ORM

risposta

19

Quali sono le migliori pratiche nell'utilizzo del tipo di dati in denaro nell'applicazione Java?

Utilizzare BigDecimal. L'utilizzo di qualsiasi primitiva corrisponderà a prima o poi a problemi di precisione.

E che dire di ORM e SQL nei database più diffusi.

Hibernate (e probabilmente tutti gli altri) può gestire perfettamente BigDecimal. E si traduce nel tipo di database appropriato, che di solito è DECIMALE.

+0

Quindi ti depositi i centesimi? – Spider

+0

No, il grande decimale contiene informazioni su dove si trova il separatore.Si traduce in un decimale regolare nel DB. Inoltre, solo la memorizzazione dei centesimi è una soluzione complicata: mentre potrebbe avere senso per alcune monete con solo 2 cifre decimali, ci sono alcune monete che contiene 3 cifre decimali, alcuni che hanno 2 o 3 cifre decimali, e alcuni hanno nessuna. Per non parlare del fatto che alcune cose hanno un prezzo di 3 cifre, anche se la valuta ha solo 2 cifre di frazione. – jpkrohling

16

È necessario utilizzare BigDecimal per rappresentare i valori monetari.

Da Bloch, J., Effective Java, 2a ed, Articolo 48:

Il float e double tipi sono particolarmente poco adatti per monetarie calcoli perché è impossibile rappresentare 0.1 (o qualsiasi altra potenza negativa di 10 ) come float o double esattamente.

Ad esempio, supponiamo di avere $ 1,03 e di spendere 42c. Quanti soldi hai ti sei lasciato?

System.out.println(1.03 - .42); 

stampe fuori 0.6100000000000001.

Il modo giusto per risolvere questo problema è da usare BigDecimal, int o long per i calcoli monetari.

Per SQL, utilizzo NUMERIC(19,2).

4

Nei cerchi di sviluppo, è comunemente considerata la migliore procedura per utilizzare BigDecimal in cambio di denaro in Java. Questo non vuol dire che è sempre meglio che usare il doppio IMHO, ma ti suggerisco di iniziare con BigDecimal.

Per SQL, suggerisco di utilizzare un tipo corrispondente NUMERIC o DECIMAL per BigDecimal e REAL per il doppio.

Vale la pena notare che tutte le banche di investimento e le case di trading che ho lavorato per l'uso raddoppiano con arrotondamento per denaro (in C++ e Java). Al contrario non ho mai visto BigDecimal usato, ma ho visto NUMERIC usato nei database. A fini contabili usa BigDecimal.

Problemi correlati