OVH Cloud OVH Cloud

nombres monetaires

15 réponses
Avatar
sebastien.plipon
Existe t-il (dans la STL ou autre) une possibilité de stocker (définir
le nombre de chiffres avant et après la virgule) et de gérer
(addition, soustraction, affichage, ...) des nombres monétaires.

Merci.

10 réponses

1 2
Avatar
kanze
(splipon) wrote in message
news:...

Existe t-il (dans la STL ou autre) une possibilité de stocker (dé
finir le nombre de chiffres avant et après la virgule) et de gérer
(addition, soustraction, affichage, ...) des nombres monétaires.


En tant que tel, non, mais il faudrait savoir exactement ce que tu
entends par « nombres monétaire ». Est-ce qu'ils incluent la monnaie
aussi, par exemple ?

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Avatar
sebastien.plipon
wrote in message
En tant que tel, non, mais il faudrait savoir exactement ce que tu
entends par « nombres monétaire »


Pouvoir définir le nombre de chiffres avant et après le signe décimal
lors de la création du "nombre monétaire".
Si possible avoir l'addition, la soustraction sur ces "nombres".

En fait, je cherche un type de nombre autre que int ou float, qui soit
mieux adapté pour le stockage de chiffres comptables.

Merci.

Avatar
Alexandre
"splipon" a écrit dans le message de
news:
wrote in message
En tant que tel, non, mais il faudrait savoir exactement ce que tu
entends par « nombres monétaire »


Pouvoir définir le nombre de chiffres avant et après le signe décimal
lors de la création du "nombre monétaire".
Si possible avoir l'addition, la soustraction sur ces "nombres".

En fait, je cherche un type de nombre autre que int ou float, qui soit
mieux adapté pour le stockage de chiffres comptables.

Merci.


Je ne crois pas qu'il existe une telle classe en standard. Par contre il
existe des fonctions money_* qui permettent le formatage de chaines suivant
un standard monétaire. Mais rien, je crois, pour les additions (le but est
je pense de s'affranchir des erreurs d'arrondi créés par les floats ?)...
Ceci dit, si tu n'as besoin que d'addition et soustraction, alors utilises
des entiers (code en centimes...) et ne rajoute la "virgule" que pour les
affichages...


Avatar
Fabien LE LEZ
On 26 Jan 2004 11:11:55 -0800, (splipon)
wrote:

En fait, je cherche un type de nombre autre que int ou float, qui soit
mieux adapté pour le stockage de chiffres comptables.


Pour des calculs simples, int peut convenir, à condition bien sûr de
prendre comme unité la plus petite unité existant dans la monnaie (par
exemple, le centime d'euro).

--
;-)

http://www.gotw.ca/gotw/063.htm
http://www.gotw.ca/gotw/067.htm#2

Avatar
jz
Fabien LE LEZ wrote:
On 26 Jan 2004 11:11:55 -0800, (splipon)
wrote:


En fait, je cherche un type de nombre autre que int ou float, qui soit
mieux adapté pour le stockage de chiffres comptables.



Pour des calculs simples, int peut convenir, à condition bien sûr de
prendre comme unité la plus petite unité existant dans la monnaie (par
exemple, le centime d'euro).



Attention : avec un int en 32 bits, tu ne pourras pas dépasser 21474836.47

C'est hélas largement assez pour ma comptabilité pesonnelle mais je
doute qu'une comptabilité d'entreprise tolère une telle limite.

De plus les programmes financiers calculent avec plus de 2 décimales
pour obtenir des arrondis corrects. Il faut utiliser au moins des
entiers 64 bits, ou gérer à la main la partie décimale et la partie
entière dans une structure.
Dans tous les cas il faut une arithmétique exacte, donc surtout pas de
nombres flottants, la précision est trop faible, même avec le type double.

Jacques


Avatar
Arnaud Debaene
jz wrote:
Dans tous les cas il faut une arithmétique exacte, donc surtout pas de
nombres flottants, la précision est trop faible, même avec le type
double.
Et pour faire les conversions d'une monnaie à l'autre?


Arnaud

Avatar
Benoit Dejean
Le Mon, 26 Jan 2004 22:39:10 +0100, jz a écrit :

Attention : avec un int en 32 bits, tu ne pourras pas dépasser 21474836.47

C'est hélas largement assez pour ma comptabilité pesonnelle mais je
doute qu'une comptabilité d'entreprise tolère une telle limite.



GNU MPZ est très bien pour ça

Avatar
Christophe Lephay
splipon wrote:
Existe t-il (dans la STL ou autre) une possibilité de stocker (définir
le nombre de chiffres avant et après la virgule) et de gérer
(addition, soustraction, affichage, ...) des nombres monétaires.


Concernant le stockage, tu as les types float et double qui permettent de
stocker des nombres décimaux. Cependant la précision est fixe pour une
machine cible. Tu as des manipulateurs dans les flux pour changer le nombre
de chiffres après la virgule à l'affichage, mais celà n'altère en rien la
manire dont les nombres sont stockés.

Concernant les nombres monétaires, ils sont souvent peu adaptés à une
représentation en virgule flottante. Une représentation de type BCD (ou des
variantes plus compactes) leur est souvent préférable. Dans ce dernier cas,
cependant, c'est à toi d'implémenter une telle représentation.

Chris

Avatar
kanze
(splipon) wrote in message
news:...
wrote in message
En tant que tel, non, mais il faudrait savoir exactement ce que tu
entends par « nombres monétaire »


Pouvoir définir le nombre de chiffres avant et après le signe décimal
lors de la création du "nombre monétaire".
Si possible avoir l'addition, la soustraction sur ces "nombres".

En fait, je cherche un type de nombre autre que int ou float, qui soit
mieux adapté pour le stockage de chiffres comptables.


En gros, ce qu'il te faut est un type décimal. Il en existe un certain
nombre -- je sais que dans le temps, Rogue Wave en a, par exemple
(payant).

Le IBM Alpha Works a un excellent package, disponible gratuitement. Les
problèmes, c'est d'une part, ce n'est disponible qu'en C et en Java, et
de l'autre, la license n'est valable que pour l'évaluation. S'il doit
être assez facile à résoudre le premier en écrivant un wrapper, le
deuxième problème me semble majeur. (En revanche, IBM a contribué la
version Java à la « Java Community Process », de façon à ce qu'il soit
généralement disponible aux Javistes.)

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Pierre Maurette
"splipon" a écrit ...
Existe t-il (dans la STL ou autre) une possibilité de stocker (définir
le nombre de chiffres avant et après la virgule) et de gérer
(addition, soustraction, affichage, ...) des nombres monétaires.
Apparemment rien dans la STL (recherche sur "currency").

Stocker et gérer un type en C++, c'est une classe.
Le C++ de Borland (la VCL) utilise un classe Currency. Je ne cite Borland
que parce que ça donne une base de réflexion, en particulier sur le fait
qu'un int32 comme un float64 sont insuffisants. La donnée encapsulée est un
int64, lui-même issu d'un type Delphi natif, qui semble utiliser la CPU dans
les calculs (le type Currency de Delphi est classé parmi les types réels).
Les erreurs d'arrondi sont minimisées.
Ce qui est intéressant, ce sont les étendues (ils ont du y réfléchir):
- entier signé sur 64 bits.
- les quatre chiffres les moins significatifs de la représentation décimale
sont considérés comme "après la virgule".
- ainsi, la représentation va de :
-922337203685477.5808 à 922337203685477.5807
L'écriture des opérateurs dépend de ce dont vous disposez en int64 et de
votre niveau de portabilité, mais ce n'est pas la mer à boire, sauf celui
qui affiche la somme en bon français si vous en avez besoin.
Je pense que la plus petite subdivision "légale" de l'euro est le millime,
et non le centime (comme pour le franc), indépendamment de la précision
interne dont le but est d'éviter les erreurs d'arrondi.

PS: J'ai lu que la CPU Intel optimise les calculs financiers exacts. Mais je
ne retrouve pas la citation, et même s'il s'agit du format packed BCD ou de
flottant 80 bits.

Pierre

1 2