On dirait que le Money
type est déconseillé comme décrit ici
Mon application doit stocker des devises, quel type de données dois-je utiliser? Numérique, argent ou FLOTTEUR?
sql
postgresql
database-design
rêveur
la source
la source
Réponses:
Numérique avec précision forcée de 2 unités. N'utilisez jamais float ou float comme le type de données pour représenter la devise, car si vous le faites, les gens seront mécontents lorsque le résultat final du rapport financier est incorrect de + ou - quelques dollars.
Le type d'argent est simplement laissé pour des raisons historiques pour autant que je sache.
la source
scale - precision
numeric(3,2)
sera en mesure de stocker max9.99
3-2 = 1
Votre source n'est en aucun cas officielle. Il date de 2011 et je ne reconnais même pas les auteurs. Si le type de monnaie était officiellement "découragé", PostgreSQL le dirait dans le manuel - ce qu'il ne fait pas .
Pour une source plus officielle , lisez ce fil de discussion dans pgsql-general (à partir de cette semaine seulement!) , Avec les déclarations des principaux développeurs dont D'Arcy JM Cain (auteur original du type d'argent) et Tom Lane:
Réponse connexe (et commentaires!) Sur les améliorations des versions récentes:
Fondamentalement,
money
a ses utilisations (très limitées). Le Wiki Postgres suggère de l'éviter en grande partie, sauf dans les cas étroitement définis. L'avantagenumeric
est la performance .decimal
est juste un alias pournumeric
dans Postgres, et largement utilisé pour les données monétaires, étant de type "précision arbitraire". Le manuel :Personnellement, j'aime stocker la monnaie comme
integer
représentant des cents si des cents fractionnaires ne se produisent jamais (essentiellement là où l'argent a du sens). C'est plus efficace que n'importe quelle autre des options mentionnées.la source
money
type était, en fait, obsolète. Les problèmes ont été résolus et le type a été ajouté dans les versions ultérieures. Personnellement, j'aime stocker la monnaie commeinteger
représentant des cents.Vos choix sont:
bigint
: enregistrez le montant en centimes. C'est ce qu'utilisent les transactions EFTPOS.decimal(12,2)
: enregistrez le montant avec exactement deux décimales. C'est ce que la plupart des logiciels de grand livre utilisent.float
: idée terrible - précision insuffisante. C'est ce qu'utilisent les développeurs naïfs.L'option 2 est la plus courante et la plus simple à utiliser. Faites en sorte que la précision (12 dans mon exemple, ce qui signifie 12 chiffres en tout) soit grande ou petite, ce qui vous convient le mieux.
Notez que si vous agrégez plusieurs transactions résultant d'un calcul (par exemple impliquant un taux de change) en une seule valeur ayant une signification commerciale, la précision doit être plus élevée pour fournir une valeur macro précise; pensez à utiliser quelque chose comme
decimal(18, 8)
pour que la somme soit exacte et que les valeurs individuelles puissent être arrondies au centième de précision pour l'affichage.la source
numeric(15,4)
ounumeric(15,6)
est une bonne idée.Je garde tous mes champs monétaires comme:
numeric(15,6)
Il semble excessif d'avoir autant de décimales, mais s'il y a la moindre chance que vous ayez à gérer plusieurs devises, vous aurez besoin de beaucoup de précision pour la conversion. Peu importe ce que je présente à un utilisateur, je stocke toujours en dollars américains. De cette façon, je peux facilement convertir dans n'importe quelle autre devise, compte tenu du taux de conversion pour la journée concernée.
Si vous ne faites jamais rien d'autre qu'une devise, le pire ici est que vous avez perdu un peu d'espace pour stocker des zéros.
la source
Utilisez un entier 64 bits stocké sous
bigint
Je recommande d'utiliser des micro-dollars (ou une devise similaire). Micro signifie 1 millionième donc 1 micro-dollar = 0,000001 $.
la source
numeric(15,6)
suggéré dans une autre réponse?bigint
. Il existe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... mais il est livré avec un support limité (pour l'instant) et des mises en garde (par exemple, vous ne pouvez pas le multiplier par un flottant facilement lors de la conversion de devises) . Étant donné que le maximum que vous pouvez stocker dans un entier JS en utilisant des micro-dollars est de 9 milliards de dollars, ce qui est probablement toujours bon dans la plupart des cas.Permet
BigInt
de stocker la devise sous la forme d'un entier positif représentant la valeur monétaire dans la plus petite unité monétaire (par exemple, 100 cents pour stocker 1,00 USD ou 100 cents pour stocker 100 ¥ (yen japonais, une devise à zéro décimal). C'est ce que fait Stripe - un les sociétés de services financiers les plus importantes pour le commerce électronique mondial.la source