SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 5 déc. 2006 à 16:24
Hello,
Il exista la méthode static Math.Round.
Tu peux lui donner en argument le nombre et le nombre de décimales.
Attention tout de même, comme il travail avec des nombre en virgule flottante, l'arrondi n'est pas forcémment très précis :
Math.Round(1.115,2) donne 1.12
Math.Round(1.125,2) donne 1.12
Math.Round(1.1151,2) donne 1.13
Rhend
Messages postés43Date d'inscriptionlundi 20 octobre 2008StatutMembreDernière intervention14 juin 2009 4 févr. 2009 à 12:20
Bonjour,
Je remonte ce topic afin de savoir si il n'y avais pas une technique qui permettait d'avoir un résultat vraiment très précis pour arrondire un double ? Car j'ai une erreur d'arrondis au centième a 0,01 :-( Et ca me fou tout en l'air car c'est pas acceptable dans le projet que je suis en train de réaliser :/
Rhend
Messages postés43Date d'inscriptionlundi 20 octobre 2008StatutMembreDernière intervention14 juin 2009 6 févr. 2009 à 12:15
Bonjour,
Alors voila mon projet permet à l'utilisateur de crée un "Panier", dans ce panier il y a différents produits qui ont chacun un prix.
Lorsque l'utilisateur clic sur un produit, il se met dans le "Panier" et son prix TTC, HT, ca TVA Correspondante (5,5 Nourriture, 5,5 Boisson ou 19,6 Nourriture/Boisson), et le HT de la TVA correspondante subisse une MAJ (se sont toutes des TextBox).
Il y a 3 différents ensemble possibles regroupant chacun des produits >> Pizza, Produit et Produit Stocké (je vais pas m'étendre + la dessus c'est pas le sujet). Juste un truc à savoir, c'est que chacun de ces ensemble apelles leur classes spécifique avec des get/set dans la couche metier qui initialise les variables avec les bon prix (ils sont tous déclarer en Decimal) et dans la couche persistant il y a un objet OleDbDataReader qui recupère toutes les données du produit ajouter dans le Panier.
L'utilisateur a la possibiliter, a tout moment, de faire une reduction sur la TVA qu'il souhaite. Et c'est la ou j'ai mon problème, c'est que lors de certaines réduction, les arrondis se font mal.
Bref, voila pour l'explication du contexte.
L'exemple : Lorsque j'ajoute un Coca Cola Zero 1,5L ayant comme valeur monétaire suivante :
- 3 ? TTC
- 2,83? HT
- 0,17? TVA 5,5 Boisson
- 2,83? HT TVA 5,5 Boisson
et que je fais une reduction de 3?, tout es correct, j'ai bien 0,00? de partout.
Mais lorsque j'ajoute 2 Coca Cola Zero 1,5L, ca double bien les 4 valeurs, MAIS lorsque je fais une réduction de 6? alors je me retrouve avec ceci :
-> 0,00? TTC
-> 0,00? HT
-> 0,01? TVA 5,5 Boisson
-> -0,01 HT TVA 5,5 Boisson (içi j'ai un négatif :/)
J'ai donc un problème d'arrondis qui me fait tout foiré et j'avoue ne pas réussir a résoudre ce problème.
Je vous met la partie de code qui correspond a la reduction :
// Declaration des variables doubles + initialisation de celles-ci.
decimal reduc = 0m;
reduc =
decimal.Parse(tb_reduc.Text.Replace(
".",
","));
// Gestion du total ttc.
totTTC -= reduc;
// TVA 5,5 pour la Boisson coch‚
if (cb_TVA55B.Checked)
{
// TVA à 5,5 donc on * par 0,945 la reduction et on retrouve le HT du résultat
totHT += -(reduc * 0.945m);
// La TVA est = à la TVA 5,5 Boisson - ( Reduction * 0,055) que j'arrondi a 2 chiffres apres la ,
totTVA55B += -(reduc * 0.055m);
// Le montant totale HT de la TVA 5,5 Boisson est = Totale HT TVA 5,5 Boisson - (Reduc * 0,945)
totHTTVA55B += - ( reduc * 0.945m);
cb_TVA55B.Checked =
false;
}
Sachant que j'ai 3 Bloc IF qui correspond aux différentes TVA possible et que pour optimiser le code, à la fin de l'évènement j'appele une méthode qui arrondis les résultats et qui les met dans leurs TB respectifs, voici le code :
// J'utilise la classe Math pour pouvoir arrondir a 2 chiffres apres la , le resultat.
Rhend
Messages postés43Date d'inscriptionlundi 20 octobre 2008StatutMembreDernière intervention14 juin 2009 6 févr. 2009 à 12:16
Une petite précision, lorsque j'ai arrondis a 3 Chiffres après la virgule, je m'aperçois que pour l'etape a 3€ j'ai pas 0,00 mais 0,005, ce qui explique le 0,01 pour 6€ mais bon c'est pas normal :(
Rhend
Messages postés43Date d'inscriptionlundi 20 octobre 2008StatutMembreDernière intervention14 juin 2009 9 févr. 2009 à 17:38
Je viens aux nouvelles ? Est-ce que tu vois pourquoi je me fais avoir ?
Une particularité que j'ai isoler dans ce problème : Ma réduction ne marche pas uniquement lorsque je veux réduire la TVA selectionner à 0. Peut-etre tous simplement le langage qui gère mal ceci ?
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 10 févr. 2009 à 13:17
Hello,
Je pense que c'est tout à fait normal.
Pour calculer correctement, tu calcules la tva, tu l'arrondis, puis tu calcules le montant hors taxes en faisant la différence entre le total TTC et la tva.
De cette manière, pas de centime résiduel.
Amicalement, SharpMao
"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Rhend
Messages postés43Date d'inscriptionlundi 20 octobre 2008StatutMembreDernière intervention14 juin 2009 10 févr. 2009 à 14:26
Je ne peux pas calculer le montant hors taxes en faisant la différence entre le total TTC et la TVA, car si lors de la même commande j'ajoute un produit sur une autre TVA et bien le montant TTC lui va augmenter et donc le motant hors taxe de la TVA va également monter alors que ce n'est pas ce qu'il doit faire. Pour être plus concret :
- J'ajoute un produit de 15€ qui est soumis a la TVA 5,5 Nourriture
On à le TTC a 15 €
la TVA 5,5 qui est à 0,825 donc arrondis a 0,83€ avec la méthode math.round()
le HT Total qui est de 14,17€
et le HT TVA 5,5 à 14,17€.
- Maintenant j'ajoute un produit de 30€ qui est soumis à la TVA 19,6 boisson
On a le TTC a 45 €
La TVA 5,5 a 0,83€
Le HT TVA 5,5 a 14,17€
La TVA 19,6 à 5,88€
Le HT TVA 19,6 a 24,12€
Et le HT Total a 38,28€
Rhend
Messages postés43Date d'inscriptionlundi 20 octobre 2008StatutMembreDernière intervention14 juin 2009 16 févr. 2009 à 15:57
Pour l'instant la seul alternative que j'ai trouver, mais ca ne corrige pas le problème a 100%, c'est d'arrondir d'abord à 3 chiffres après la virgule (ce qui fait qu'on passe d'un exposant x à juste 3 chiffres après la , ce qui est un peu plus pratique) et ré-arrondir à 2 chiffres après la , .
C'est ultra bancale mais en attendant d'avoir mieux... ^^ Regarde déjà si ca peut t'aider.