Question

Quelle classe dois-je utiliser pour la représentation de l'argent afin d'éviter la plupart des erreurs d'arrondi?

Devrais-je utiliser Decimal ou un simple numéro intégré ?

Existe-t-il une classe Money prenant en charge la conversion de devise que je pourrais utiliser?

Des pièges à éviter?

Était-ce utile?

La solution

Je suppose que vous parlez de Python. http://code.google.com/p/python-money/ "Primitives pour travailler avec de l'argent et des devises en Python" - le titre est explicite:)

Autres conseils

N'utilisez jamais un nombre à virgule flottante pour représenter de l'argent. Les nombres flottants ne représentent pas les nombres en notation décimale avec précision. Vous vous retrouveriez avec un cauchemar d'erreurs d'arrondi composé et une conversion fiable entre les devises. Voir le bref essai de Martin Fowler sur le sujet .

Si vous décidez d'écrire votre propre classe, je vous recommande de vous baser sur la décimal type de données.

Je ne pense pas que python-money soit une bonne option, car il n’a pas été maintenu depuis un bon bout de temps et que son code source contient un code étrange et inutile, et que l’échange de devises est tout simplement cassé.

Essayez py-moneyed . C'est une amélioration par rapport à l'argent du python.

Utilisez simplement décimal .

Vous pourriez être intéressé par QuantLib pour travailler avec Finance.

Il a des classes intégrées pour la gestion des types de devise et réclame 4 années de développement actif.

Vous pouvez consulter cette bibliothèque: python-money . Comme je n’ai aucune expérience en la matière, je ne peux pas en dire plus sur son utilité.

Une astuce que vous pouvez utiliser pour gérer les devises sous forme d'entiers:

  • Multipliez par 100 / divisez par 100 (par exemple, 100,25 USD - > 10025) pour obtenir une représentation en "cents"

Idée simple, légère et extensible:

class Money():

    def __init__(self, value):
        # internally use Decimal or cents as long
        self._cents = long(0)
        # Now parse 'value' as needed e.g. locale-specific user-entered string, cents, Money, etc.
        # Decimal helps in conversion

    def as_my_app_specific_protocol(self):
        # some application-specific representation

    def __str__(self):
        # user-friendly form, locale specific if needed

    # rich comparison and basic arithmetics
    def __lt__(self, other):
        return self._cents < Money(other)._cents
    def __add__(self, other):
        return Money(self._cents + Money(other)._cents)

Vous pouvez:

  • N'implémentez que ce dont vous avez besoin dans votre application.
  • Étendez-le à mesure que vous grandissez.
  • Modifiez la représentation interne et l'implémentation si nécessaire.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top