2010-07-16 12 views
11

Estoy lidiando con muchas monedas diferentes en mi aplicación, y quiero saber cuál es la "mejor" forma de almacenarlas en una base de datos SQLite3.Almacenamiento de valores de moneda en SQLite3

Me estoy inclinando hacia una representación de punto fijo (es decir, almacenarlos como enteros, donde $ 3.59 se almacena como 359, 400 ¥ como 4000). ¿Es esta una buena idea? ¿Qué pasa si mis datos de entrada cambian más tarde y requieren más precisión?

Respuesta

18

Dado que SQLite 3 utilizará hasta 8 bytes para almacenar los tipos INTEGER, a menos que vaya a tener números mayores que 10^16, debería estar bien.

Para poner esto en perspectiva, el producto interno bruto mundial expresado en milésimas de un USD (un molino) es aproximadamente 61'000'000'000'000'000 que sqlite3 no tiene ningún problema para expresar.

sqlite> create table gdp (planet string, mills integer); 
sqlite> insert into gdp (planet, mills) values ('earth', 61000000000000000000); 
sqlite> select * from gdp; 
earth|61000000000000000000 

A menos que usted está manejando la contabilidad interplanetaria, no creo que haya que preocuparse.

+1

Hay que tener en cuenta todas las posibilidades ... ;-) ¡Gracias! – nornagon

+10

Bueno, para ser completamente exacto, esto no tiene en cuenta todas las eventualidades: http://en.wikipedia.org/wiki/File%3AZimbabwe_%24100_trillion_2009_Obverse.jpg – msw

0

Yo diría cadena/texto. Siempre puede convertirlo a cualquier cultura si necesita hacer eso también.

+3

Almacenar datos numéricos como cadenas es una tontería, especialmente cuando hay una tipo numérico perfectamente fino que admite el caso de uso. –

1

En la moneda del software financiero siempre se representa como punto fijo (decimal). Puede emularlo en SQLite usando enteros (el entero de 64 bits tiene capacidad para 18 dígitos).

0

mejor DataType moneda es BigDecimal y en sqlite que puede almacenar como un campo VARCHAR

ormlite convertir BigDecimal a cadena cuando se lo almacena.

ormlite doc for BigDecimal

-3

SQLite no tiene campo BigDecimal lo tanto, utilizar el tipo de SQLite Entero y convertir de este modo: BigDecimal bd = new BigDecimal ("1234,5678"); int packedInt = bd.scaleByPowerOfTen (4) .intValue(); // packedInt now = 12345678 Ahora guarda el campo packedInt to SQLite Integer. Para volver a BigDecimal: BigDecimal bd = new BigDecimal (packedInt); // bd = 12345678 bd = bd.scaleByPowerOfTen (-4); // ahora bd = 1234.5678

+0

No publique [respuestas idénticas] (http://stackoverflow.com/a/39626427/5292302) a preguntas múltiples. Publique una buena respuesta, luego vote/marque para cerrar las otras preguntas como duplicados. Si la pregunta no es un duplicado, * adapte sus respuestas a la pregunta. * –

Cuestiones relacionadas