Quelles sont les meilleures pratiques pour stocker des devises/valeurs monétaires dans la base de données, les traiter dans une application côté serveur, et enfin les envoyer au navigateur via une API JSON ?
J'ai imaginé deux approches, mais je ne sais pas comment peser le pour et le contre :
Stocker les valeurs sous forme d'entiers dans la plus petite unité monétaire.
- En gros, cela signifie que la base de données stockera la valeur monétaire en cents / paises / shillings / etc.
- L'application côté serveur fera correspondre cette valeur à une variable entière ordinaire.
- L'API JSON représentera la valeur comme un nombre JSON normal.
- L'inconvénient de cette approche est que vous devez constamment diviser par 100 avant d'afficher une valeur monétaire à l'utilisateur et toujours multiplier par 100 avant de stocker toute entrée utilisateur.
- Problèmes possibles : Comment définir la plus petite unité monétaire ? Est-ce sur la base de deux ou quatre décimales ? Existe-t-il une monnaie qui n'a pas un rapport de 100:1, c'est-à-dire 100 cents = 1 dollar.
Stockez les valeurs sous forme décimale/numérique avec une précision et une échelle fixes.
- La BD stocke la valeur monétaire comme un type décimal/numérique avec une précision et une échelle fixes, par exemple NUMERIC(10,2).
- L'application côté serveur les fait correspondre à des objets spéciaux qui peuvent préserver la précision et l'échelle entre les calculs, par exemple.
BigDecimal
en Ruby. - L'API JSON échange ces valeurs comme cordes et non des chiffres. En effet, les nombres seraient automatiquement analysés comme des flottants par l'analyseur JSON, ce qui entraînerait une perte de précision.
- L'inconvénient de cette approche est que tous les calculs côté serveur doivent s'effectuer dans un type de données encadré (éventuellement plus lent) ET que les analyseurs JSON doivent être conscients du fait que certaines chaînes ne sont pas réellement des chaînes, mais des valeurs numériques.
- L'avantage de cette méthode est que vous n'avez pas besoin de multiplier et de diviser constamment par 100.
Existe-t-il une meilleure pratique généralement acceptée en la matière ?