web-dev-qa-db-fra.com

PostgreSQL: Quel type de données devrait être utilisé pour Currency?

On dirait que Money le type est déconseillé comme décrit ici

Mon application doit stocker de la monnaie. Quel type de données dois-je utiliser? Numérique, Argent ou FLOTTEUR?

105
daydreamer

Numérique avec une précision forcée de 2 unités. N'utilisez jamais float ou float comme type de données pour représenter la devise, car si vous le faites, les gens vont être mécontents lorsque le résultat final du rapport financier est incorrect de + ou - quelques dollars.

Le type d’argent n’est laissé que pour des raisons historiques, pour autant que je sache.

75
Chris Farmiloe

Votre source n'est en aucun cas officielle. Il date de 2011 et je ne reconnais même pas les auteurs. Si le type d'argent était "découragé", PostgreSQL le dirait dans le manuel - ce qui n'est pas le cas .

Pour une source plus officielle , lisez ce fil dans pgsql-general (à partir de cette semaine!) , avec les déclarations du noyau Les développeurs, y compris D'Arcy JM Cain (auteur original du type d'argent) et Tom Lane:

En gros, money a ses utilisations (limitées). L'avantage sur numeric est performance.

decimal n'est qu'un alias pour numeric dans Postgres.

Réponse associée (et commentaires!) Sur les améliorations apportées aux versions récentes:

Personnellement, j'aime bien stocker les devises en tant que integer représentant des cents. C'est plus efficace que toutes les autres options mentionnées.

94
Erwin Brandstetter

Vos choix sont:

  1. integer: enregistre le montant en cents. C'est ce que les transactions EFTPOS utilisent.
  2. decimal(12,2): enregistre le montant avec exactement deux décimales. C'est ce que la plupart des logiciels de grand livre utilisent.
  3. float: idée terrible - précision insuffisante. C'est ce que les développeurs naïfs utilisent.

L'option 2 est la plus courante et la plus facile à utiliser. Faites en sorte que la précision (12 dans mon exemple, soit 12 chiffres au total) soit la plus grande ou la plus petite qui vous convient le mieux.

Notez que si vous regroupez plusieurs transactions résultant d'un calcul (impliquant par exemple un taux de change) en une seule valeur ayant une signification commerciale, la précision doit être supérieure 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 cent près pour l'affichage.

58
Bohemian

Je garde tous mes champs monétaires comme:

numeric(15,6)

Cela 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 cette 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 en une autre devise, étant donné le taux de conversion pour la journée concernée.

Si vous ne faites jamais qu'une seule devise, le pire est que vous avez perdu un peu d’espace pour stocker des zéros.

20
Michael Collette

Utilisez un entier de 64 bits stocké sous le nom bigint

Je recommande d'utiliser des micro-dollars (ou une devise majeure similaire). Micro signifie 1 millionième donc 1 micro-dollar = 0,000001 $.

  • Assez de précision pour traiter des fractions de cent.
  • Fonctionne bien pour un prix unitaire très faible (comme les impressions d’annonces ou les frais d’API).
  • Simple à utiliser et compatible avec toutes les langues.
  • Stockage de données plus petit que les chaînes ou les chiffres.
  • Facile à maintenir la précision grâce à des calculs et à l'arrondi à la sortie finale.
8
Mani Gandham