French Additionner des champs de base de données

Thaca

Member
Licensed User
Longtime User
Bonjour,
J'ai crée une base de données pour gérer mes comptes et je me retrouve face à un problème. Chaque dépense ou recette est enregistrée avec deux décimales or lorsque je calcule le solde de mon compte le résultat comporte 12 décimales !!!
Si je vérifie mes enregistrements avec un autre lecteur de base de données je n'ai bien que des enregistrements avec 2 décimales. J'ai tout essayé (enfin ce à quoi j'ai pensé...) Utiliser la fonction TOTAL au lieu de SUM, changer les caractéristiques de mes champs... mais pas moyen d'obtenir un résultat exact.
Quelqu'un a-t-il déjà rencontré ce problème ?
Merci de votre aide.
 

klaus

Expert
Licensed User
Longtime User
Basic4Android effectue tous les calculs avec des variables du type Double.
Il y a des nombres décimaux qui n'ont pas d'équivalent exact en binaire d'ou beaucoup de décimales.
Comment effectues-tu les calculs ?
Pour afficher les résultats utilises la fonction NumberFormat2.
Exemple:
EditText1.Text = NumberFormat2(Somme, 1, 2, 2, False)

Meilleures salutations.
 

Thaca

Member
Licensed User
Longtime User
Bonjour Klaus,
Merci pour ta réponse. Voici le code que j'utilise :

Sub solde
Dim query1, query2 As String
Dim TotalR, TotalD As Double

query1 = "SELECT TOTAL(Recettes) FROM comptes"
query2 = "SELECT TOTAL(Dépenses) FROM comptes"
TotalR = SQL1.ExecQuerySingleResult(query1)
TotalD = SQL1.ExecQuerySingleResult(query2)
edtSolde.text = NumberFormat2 (TotalR-TotalD, 1, 2, 2 ,False)
End Sub

J'ai bien pensé à utiliser "NumberFormat" cependant comme le résultat de mon calcul était faux (0.03 d'écart au bout d'une centaine d'enregistrements) j'ai supprimé le numberFormat pour voir mon résultat c'est ainsi que j'ai vu cenombre de décimales.
Mon but reste quand même de récupérer un total exact au centime près (déformation de comptable...) Comment puis-je procéder autrement ? Une autre façon de procéder ?
 

Informatix

Expert
Licensed User
Longtime User
Basic4Android effectue tous les calculs avec des variables du type Double.

Euh, pas vraiment. Il utilise le type de la variable. Si tu déclares des floats, il utilise des floats. Et là, l'imprécision qui s'accumule au fil des calculs n'est pas négligeable.
Mais dans le cas présent, cela me semble un peu trop, en effet, surtout avec des Doubles.
 

Thaca

Member
Licensed User
Longtime User
Merci pour vos réponses. Je confirme j'ai bien une erreur de 0.03. J'ai repointé mes chiffres et pas de problème de saisie.
 

Informatix

Expert
Licensed User
Longtime User
Merci pour vos réponses. Je confirme j'ai bien une erreur de 0.03. J'ai repointé mes chiffres et pas de problème de saisie.

Cette énorme erreur m'étonne un peu, mais quoi qu'il en soit, les valeurs monétaires doivent être stockées avec le type entier dans les bases SQLite car le type Currency n'existe pas et le type Float n'est pas suffisamment exact pour des calculs financiers. Donc, tu multiplies toutes tes valeurs par 100 avant de les écrire dans la base et tu les divises par 100 avant de les afficher à l'utilisateur (tu calcules des entiers en interne). Aucune approximation possible, même après des milliers de calcul.
 

Thaca

Member
Licensed User
Longtime User
Merci beaucoup pour ta réponse. Je n'avais pas pensé à cette solution.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…