Comment traiter les erreurs d'arrondi des types flottants pour les calculs financiers dans Python SQLite?

StackOverflow https://stackoverflow.com/questions/1801307

  •  05-07-2019
  •  | 
  •  

Question

Je crée une application financière et mes flotteurs dans sqlite semblent flotter. Parfois, un 4.0 sera un 4.000009, et un 6.0 sera un 6.00006, des choses comme ça. Comment puis-je les rendre plus exacts sans affecter mes calculs financiers?

Les valeurs proviennent de Python si cela compte. Vous ne savez pas de quelle région proviennent les numéros en désordre.

Était-ce utile?

La solution

Il s'agit d'un problème courant qui utilise SQLite car il n'a pas de type monétaire.
Comme S.Mark l'a dit, vous pouvez utiliser la bibliothèque de représentations Decimal . Cependant, SQLite 3 ne prend en charge que les nombres à virgule flottante binaire (type sqlite REAL). Vous devez donc stocker le fichier float codé en décimal sous forme de texte ou de BLOB ou le convertir en fichier REAL (mais vous retournerez alors à un fichier flottant binaire à 64 bits).
Pensez donc à la plage de nombres que vous devez représenter et à la possibilité d'effectuer des calculs à partir de la base de données.

Il peut être préférable d’utiliser un autre DB prenant en charge les types NUMERIC, par exemple. MYSql , PostgreSQL , Firebird

Autres conseils

Considérant qu'il s'agit d'une application financière, si vous ne disposez que de calculs comportant jusqu'à 2 ou 3 décimales, vous pouvez stocker toutes les données en interne sous forme d'entiers et les convertir uniquement en données à virgule flottante à des fins de présentation. .

ex.

6.00 -> 600
4.35 -> 435

La plupart des gens utiliseraient probablement Decimal à cet effet. Toutefois, si cela ne correspond pas à un type de base de données, vous risquez de perdre des performances.

Si les performances sont importantes, vous pouvez envisager d'utiliser des entiers pour représenter une unité monétaire appropriée. Souvent, des centimes ou des dixièmes de centimes sont acceptables.

Il devrait y avoir des règles commerciales sur la manière dont les montants doivent être arrondis dans diverses situations et des tests devraient être appliqués à chaque scénario.

Utilisez Decimal pour manipuler vos chiffres, puis utilisez pickle pour l'enregistrer et le charger à partir de SQLite sous forme de texte, car il ne gère pas les types numériques.

Enfin, utilisez les unitest et doctest , pour les opérations financières, vous voulez vous assurer que tout le code fait ce qu'il est censé faire en toutes circonstances. Vous ne pouvez pas réparer les bugs en cours de route, comme avec, disons, un réseau social ...

Vous devez utiliser des nombres décimaux. Les nombres décimaux peuvent être représentés exactement.

En virgule flottante décimale, 0,1 + 0,1 + 0,1 - 0,3 est exactement égal à zéro. En virgule flottante binaire, le résultat est 5.5511151231257827e-017.

Alors, essayez simplement décimal:

import decimal
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top