IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

8.2. Types monétaires

Le type money stocke un montant en devise avec un nombre fixe de décimales. Voir le Tableau 8.3, « Types monétaires ». 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 fait 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 conversion vers d'autres types peuvent potentiellement perdre en précision et doivent aussi de faire en deux étapes :

SELECT '52093.89'::money::numeric::float8;
    

La division d'une valeur de type money avec un entier se fait en tronquant la partie fractionnelle. Pour obtenir une valeur arrondie, divisez avec une valeur à virgule flottante ou convertissez la valeur de type money en un numeric avant de diviser, et convertissez le résultat en type money. (Cette dernière solution est privilégiée 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.