Le type money
stocke un montant en devise avec
un nombre fixe de décimales. Voir le Tableau 8.3.
La précision de la partie fractionnée est déterminée par le paramètre
lc_monetary de la base de données.
L'échelle indiquée dans la table suppose qu'il y a deux chiffres dans la
partie fractionnée.
De nombreux formats sont acceptés en entrée, dont les entiers et
les nombres à virgule flottante, ainsi que les formats classiques
de devises, comme '$1,000.00'
.
Le format de sortie est généralement dans le dernier format, mais dépend
de la locale.
Tableau 8.3. Types monétaires
Nom | Taille de stockage | Description | Étendue |
---|---|---|---|
money | 8 octets | montant monétaire | -92233720368547758.08 à +92233720368547758.07 |
Comme la sortie de type de données est sensible à la locale, la
recharge de données de type money
dans une base de données
pourrait ne pas fonctionner si la base a une configuration différente pour
lc_monetary
. Pour éviter les problèmes, avant de
restaurer une sauvegarde dans une nouvelle base de données, assurez-vous
que lc_monetary
a la même valeur ou une valeur
équivalente à celle de la base qui a été sauvegardée.
Les valeurs de types numeric
, int
et
bigint
peuvent être converties en type money
.
La conversion à partir du type real
et double
precision
peut être faite en convertissant tout d'abord vers le
type numeric
. Par exemple :
SELECT '12.34'::float8::numeric::money;
Néanmoins, ce n'est pas recommandé. Les nombres à virgules flottantes ne doivent pas être utilisés pour gérer de la monnaie à cause des erreurs potentielles d'arrondis.
Une valeur money
peut être convertie en numeric
sans perdre de précision. Les conversions vers d'autres types peuvent
potentiellement perdre en précision et doivent aussi se faire en deux
étapes :
SELECT '52093.89'::money::numeric::float8;
La division d'une valeur de type money
par une valeur de type
entier est réalisée en tronquant la partie décimale. Pour obtenir un
résultat arrondi, il faut diviser par une valeur en virgule flottante ou
convertir la valeur de type money
en numeric
avant de réaliser la division. Il faudra ensuite convertir vers le type
money
. (Cette dernière méthode est préférable pour éviter de
perdre en précision.)
Quand une valeur de type money
est divisée par une autre
valeur de type money
, le résultat est du type
double precision
(c'est-à-dire un nombre pur, pas une monnaie).
Les unités de monnaie s'annulent dans la division.