Je suis curieux de savoir lequel serait le mieux adapté en tant que champ monétaire? Je ferai des opérations simples comme prendre la différence, le pourcentage entre l'ancien et le nouveau prix. Je prévois de garder deux chiffres après le zéro (c.-à-d. 10,50) et la majorité du temps si ces chiffres sont nuls, je cacherai ces chiffres et les afficherai comme "10"
ps: la devise n'est pas basée sur le dollar :)
Utilisez toujours DecimalField
pour de l'argent. Même les opérations simples (addition, soustraction) ne sont pas à l'abri des problèmes d'arrondi flottant:
>>> 10.50 - 0.20
10.300000000000001
>>> Decimal('10.50') - Decimal('0.20')
Decimal('10.30')
La réponse à la question est correcte, mais certains utilisateurs tomberont sur cette question pour découvrir la différence entre le DecimalField et le FloatField. Le problème de l'arrondi des flotteurs que Seth soulève est un problème pour la monnaie.
Le Django Docs States
La classe FloatField est parfois mélangée avec la classe DecimalField. Bien qu'ils représentent tous les deux des nombres réels, ils représentent ces nombres différemment. FloatField utilise le type float de Python en interne, tandis que DecimalField utilise le type Decimal de Python. En savoir plus ici .
Voici d'autres différences entre les deux champs:
DecimalField:
En savoir plus sur DecimalField de la Django Docs .
FloatField:
En savoir plus sur FloatField du Django Docs .
S'applique aux deux:
Je suis tombé sur cette question en cherchant la différence entre les deux domaines, donc je pense que cela aidera ceux qui sont dans la même situation :)
MISE À JOUR: Pour répondre à la question, je pense que vous pouvez vous en tirer pour représenter la monnaie, bien que Decimal soit un bien meilleur choix. Il y a un problème d'arrondi quand il compte pour les flottants, vous devez donc utiliser round(value, 2)
afin de garder votre représentation flottante arrondie à deux décimales. Voici un petit exemple:
>>> round(1.13 * 50 + .01, 2)
56.51
Vous pouvez toujours avoir des ennuis avec le flotteur et le rond. Comme ici, nous le voyons arrondir à une valeur de 5:
>>> round(5.685, 2)
5.68
Mais dans ce cas, il arrondira:
>>> round(2.995, 2)
3.0
Cela a tout à voir avec la façon dont le flotteur est stocké en mémoire. Voir ici .
edit: Le projet Satchmo n'est plus actif, alors jetez un œil à ces alternatives pour gérer les devises
Basé sur Django Satchmo Project a un CurrencyField et CurrencyWidget qui valent le coup d'œil.
Consultez le répertoire de l'application satchmo_utils pour la source
Je sais que c'est super ancien, mais je suis tombé dessus à la recherche de quelque chose de complètement différent, et je voulais dire qu'il est généralement déconseillé d'utiliser des nombres à virgule flottante (flottant o décimal) pour la monnaie , car l'arrondi mathématique à virgule flottante entraînera invariablement de petites erreurs de calcul pouvant entraîner de très grandes différences dans le temps.
Utilisez plutôt un champ entier ou une chaîne à votre convenance. Multipliez votre devise pour déplacer la décimale à la fin et faites un nombre entier lorsque vous la stockez, puis replacez cette décimale à sa place lorsque vous devez l'afficher. C'est essentiellement la façon dont les banques (et la plupart des bibliothèques de devises) gèrent le stockage des données et vous éviteront des problèmes plus tard.
J'ai appris cela à la dure car ce n'est pas vraiment un sujet courant; cela sauve peut-être quelqu'un d'autre de faire la même chose.