¿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
¿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.
Debe usar BigDecimal
para representar los valores monetarios.
De Bloch, J., Java eficaz, segunda ed, artículo 48:
El
float
ydouble
tipos son particularmente mal adaptado para cálculos monetarios porque es imposible para representar 0,1 (o cualquier otra potencia negativa de diez) comofloat
odouble
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
olong
para los cálculos monetarios.
Para SQL, uso NUMERIC(19,2)
.
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.
- 1. ¿Qué tipo de datos debo usar para almacenar valores monetarios?
- 2. Representación de valores monetarios en Java
- 3. Cómo usar el tipo de datos largos en C?
- 4. cómo usar el tipo de datos de tiempo del servidor sql en la aplicación .net?
- 5. ¿cómo puedo usar el tipo de datos GUID en SQL Server 2008?
- 6. java datos de tipo byte
- 7. ¿Qué tipo de datos Java corresponde al tipo de datos Oracle SQL NUMERIC?
- 8. Utilizando el tipo de datos de fecha sql y EF4
- 9. Tipo de datos SQL para System.Drawing.Color
- 10. Servidor SQL: Comprobando el tipo de datos de una columna
- 11. ¿Cómo implementar la relación n: m en Java?
- 12. ¿Qué tipo de datos usar al almacenar datos de latitud y longitud en bases de datos SQL?
- 13. ¿Cómo usar las fuentes de tipo abierto en Java?
- 14. ¿Cuál es el mejor tipo de datos para usar con dinero en la aplicación Java?
- 15. Trabajando con el tipo de datos XML de SQL Server
- 16. El tipo de datos decimales de MS SQL Server redondea
- 17. ¿Cómo obtengo el tipo de datos de columna en Oracle con PL-SQL con privilegios bajos?
- 18. ¿Cómo puedo usar meta-dot (M-.) En python con emacs?
- 19. SQL Server Hexadecimal tipo de datos
- 20. LINQ to SQL Designer y el tipo de datos Geography
- 21. Usar Matlab para importar otro archivo .m
- 22. ¿Es SQL Azure compatible con el tipo de datos FILESTREAM
- 23. ¿Qué tipo de datos se debe usar para almacenar números de teléfono en SQL Server 2005?
- 24. Cómo usar Wordnet en SQL
- 25. ¿Cómo funciona el modificador -m en Perl
- 26. tipo de datos para representar un gran decimal en java
- 27. Tipo de datos sql para clave principal - SQL Server?
- 28. Por qué salida difiere en C y Java en la expresión m ++ + (++ m)
- 29. ¿Bibliotecas Javascript que permiten consultas tipo SQL en datos JSON?
- 30. Cómo usar el Switch en SQL Server
¿Entonces solo almacena los centavos? – Spider
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