2011-01-28 5 views
14

¿Cuáles son las mejores prácticas en el uso del tipo de datos monetarios en la aplicación Java? El dinero debe estar en doble variable? ¿Qué hay de redondeo, monedas, etc.? ¿Hay bibliotecas especiales para esto? Y qué decir de ORM y SQL en las bases de datos más populares. Como sé, no en todos los motores SQL es el tipo de datos de Money. En ese caso, ¿se debe usar NUMERIC(15,2), DECIMAL(15,2) o tipo de datos REAL?Cómo usar el tipo de datos monetarios en Java, SQL, ORM

Respuesta

19

¿Cuáles son las mejores prácticas en el uso del tipo de datos monetarios en la aplicación Java?

Usar BigDecimal. El uso de cualquier primitivo llevará a problemas de precisión tarde o temprano.

Y qué pasa con ORM y SQL en las bases de datos más populares.

Hibernate (y probablemente todos los demás) pueden manejar BigDecimal muy bien. Y se traduce al tipo de base de datos apropiado, que generalmente es DECIMAL.

+0

¿Entonces solo almacena los centavos? – Spider

+0

No, el gran decimal contiene información sobre dónde se encuentra el separador.Se traduce a un decimal regular en la base de datos. Además, solo almacenar los centavos es una solución difícil: si bien podría tener sentido para algunas monedas con solo 2 dígitos de fracción, hay algunas monedas que contienen 3 dígitos de fracción, algunas que tienen 2 o 3 dígitos de fracción, y algunas tienen ninguna. Sin mencionar que algunas cosas tienen un precio de 3 dígitos de fracción, incluso si la moneda tiene solo 2 dígitos de fracción. – jpkrohling

16

Debe usar BigDecimal para representar los valores monetarios.

De Bloch, J., Java eficaz, segunda ed, artículo 48:

El float y double tipos son particularmente mal adaptado para cálculos monetarios porque es imposible para representar 0,1 (o cualquier otra potencia negativa de diez) como float o double exactamente.

Por ejemplo, supongamos que tiene $ 1.03 y gasta 42c. ¿Cuánto dinero te queda ?

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

imprime 0.6100000000000001.

La forma correcta de resolver este problema es de usar BigDecimal, int o long para los cálculos monetarios.

Para SQL, uso NUMERIC(19,2).

4

En círculos de desarrollo, se considera una práctica recomendada utilizar BigDecimal como dinero en Java. Eso no quiere decir que siempre es mejor que usar el doble en mi humilde opinión, pero le sugiero que comience con BigDecimal.

Para SQL Sugiero usar un tipo coincidente NUMERIC o DECIMAL para BigDecimal y REAL para doble.

Vale la pena señalar que todos los bancos de inversión y casas de comercio para los que he trabajado usan el doble con redondeo por dinero (en C++ y Java). Por el contrario, nunca he visto usar BigDecimal, pero he visto utilizar NUMERIC en las bases de datos. Para fines contables, utilice BigDecimal.

Cuestiones relacionadas