Parece que Money
se desaconseja el tipo como se describe aquí
Mi aplicación necesita almacenar moneda, ¿qué tipo de datos debo usar? Numérico, dinero o flotante?
sql
postgresql
database-design
soñador
fuente
fuente
Respuestas:
Numérico con precisión forzada de 2 unidades. Nunca use flotante o flotante como tipo de datos para representar la moneda porque si lo hace, la gente no estará contenta cuando la cifra del resultado financiero del informe financiero sea incorrecta en + o - unos pocos dólares.
El tipo de dinero solo se deja por razones históricas por lo que puedo decir.
fuente
scale - precision
numeric(3,2)
podrá almacenar max9.99
3-2 = 1
Su fuente no es de ninguna manera oficial. Data de 2011 y ni siquiera reconozco a los autores. Si el tipo de dinero fuera oficialmente "desalentado", PostgreSQL lo diría en el manual, lo cual no es así .
Para obtener una fuente más oficial , lea este hilo en pgsql-general (¡solo de esta semana!) , Con declaraciones de desarrolladores principales que incluyen a D'Arcy JM Cain (autor original del tipo de dinero) y Tom Lane:
Respuesta relacionada (¡y comentarios!) Sobre mejoras en lanzamientos recientes:
Básicamente,
money
tiene sus usos (muy limitados). El Wiki de Postgres sugiere evitarlo en gran medida, a excepción de aquellos casos estrechamente definidos. La ventajanumeric
es el rendimiento .decimal
es solo un aliasnumeric
en Postgres, y se usa ampliamente para datos monetarios, siendo un tipo de "precisión arbitraria". El manual :Personalmente, me gusta almacenar moneda como
integer
representación de centavos si los centavos fraccionales nunca ocurren (básicamente donde el dinero tiene sentido). Eso es más eficiente que cualquier otra de las opciones mencionadas.fuente
money
tipo era, de hecho, obsoleto. Se han solucionado los problemas y el tipo se ha vuelto a agregar en versiones posteriores. Personalmente, me gusta almacenar moneda comointeger
representación de centavos.Sus elecciones son:
bigint
: almacena la cantidad en centavos. Esto es lo que usan las transacciones EFTPOS.decimal(12,2)
: almacena la cantidad con exactamente dos decimales. Esto es lo que usa el software de contabilidad más general.float
: idea terrible - precisión inadecuada. Esto es lo que usan los desarrolladores ingenuos.La opción 2 es la más común y más fácil de trabajar. Haga que la precisión (12 en mi ejemplo, que significa 12 dígitos en total) sea tan grande o pequeña como le resulte mejor.
Tenga en cuenta que si está agregando varias transacciones que fueron el resultado de un cálculo (por ejemplo, que involucra un tipo de cambio) en un solo valor que tiene un significado comercial, la precisión debería ser mayor para proporcionar un valor macro exacto; considere usar algo así
decimal(18, 8)
para que la suma sea precisa y los valores individuales se puedan redondear a una precisión de un centavo para su visualización.fuente
numeric(15,4)
onumeric(15,6)
es una buena idea.Mantengo todos mis campos monetarios como:
numeric(15,6)
Parece excesivo tener tantos decimales, pero si existe la más mínima posibilidad de tener que lidiar con múltiples monedas, necesitará tanta precisión para la conversión. No importa lo que le presente a un usuario, siempre almaceno en dólares estadounidenses. De esa manera, puedo convertir fácilmente a cualquier otra moneda, dada la tasa de conversión para el día involucrado.
Si nunca haces nada más que una moneda, lo peor aquí es que desperdiciaste un poco de espacio para almacenar algunos ceros.
fuente
Use un entero de 64 bits almacenado como
bigint
Recomiendo usar micro dólares (o una moneda principal similar). Micro significa 1 millonésimo, entonces 1 micro dólar = $ 0.000001.
fuente
numeric(15,6)
sugiere en otra respuesta?bigint
. Hay developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… pero viene con soporte limitado (por ahora) y advertencias (por ejemplo, no puede multiplicarlo fácilmente por un flotante al hacer la conversión de moneda) . Dado que el máximo que puede almacenar en un entero JS usando micro dólares es de $ 9 mil millones, lo que probablemente todavía sea bueno para la mayoría de los casos.Se usa
BigInt
para almacenar la moneda como un entero positivo que representa el valor monetario en la unidad monetaria más pequeña (por ejemplo, 100 centavos para almacenar $ 1.00 o 100 para almacenar ¥ 100 (yen japonés, una moneda decimal cero). Esto es lo que hace Stripe - uno Las empresas de servicios financieros más importantes para el comercio electrónico global.fuente