Arrondir au centieme?? [Résolu]

lyoan
Messages postés
5
Date d'inscription
mercredi 15 mars 2006
Dernière intervention
10 octobre 2007
- 5 déc. 2006 à 15:43 - Dernière réponse : Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 16 févr. 2009 à 15:57
Bonjour à tous,
Je voulais savoir si il existait une fonction qui permettrai d'arrondir un double au centieme?
Merci à vous
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
SharpMao
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
- 5 déc. 2006 à 16:30
2
Merci
Petite erreur dans le dernier exemple :

Math.Round(1.1251,2) donne 1.13

Amicalement, SharpMao

Merci SharpMao 2

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de SharpMao
SharpMao
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
- 5 déc. 2006 à 16:24
1
Merci
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

Amicalement, SharpMao
Commenter la réponse de SharpMao
Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 4 févr. 2009 à 12:20
0
Merci
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 :/
Commenter la réponse de Rhend
SharpMao
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
- 4 févr. 2009 à 16:31
0
Merci
Hello,

Si tu travailles avec de la monnaie, le seul moyen d'être vraiment précis, c'est d'utiliser des decimal à la place des double.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 4 févr. 2009 à 16:33
0
Merci
Je m'en doutais un peu, bon et bien je vais essayer ceci au plus vite ! Je tiens au courant. Merci
Commenter la réponse de Rhend
Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 5 févr. 2009 à 16:24
0
Merci
Bon et bien non pour certains chiffres les arrondis sont mauvais et donc j'ai toujours un problème de cents.
Commenter la réponse de Rhend
SharpMao
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
- 5 févr. 2009 à 16:58
0
Merci
Hello,

Tu peux me donner un exemple, ça m'intéresse.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 6 févr. 2009 à 12:15
0
Merci
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.

totHT =
Math.Round(totHT, 2);
tb_TotalHT.Text = totHT.ToString();

J'en met juste un car les autres suivent le même modèle.

Courage :-P
Commenter la réponse de Rhend
Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 6 févr. 2009 à 12:16
0
Merci
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 :(
Commenter la réponse de Rhend
Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 9 févr. 2009 à 17:38
0
Merci
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 ?
Commenter la réponse de Rhend
SharpMao
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
- 10 févr. 2009 à 13:17
0
Merci
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)
Commenter la réponse de SharpMao
Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 10 févr. 2009 à 14:26
0
Merci
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€
Commenter la réponse de Rhend
skupiewski
Messages postés
1
Date d'inscription
lundi 16 février 2009
Dernière intervention
16 février 2009
- 16 févr. 2009 à 15:54
0
Merci
Salut à tous.
J'ai exacement la même problème.

Selon le MSDN de Microsoft, l'arrondi de 4.5 donne 4 et l'arrondi de 5.5 donne 6.

Cela revient à dire que 1+1 est parfois égal à 2  et parfois pas.

Effectivement, la méthode Math.Round donne ces résultats. Je me demande à quoi peut bien servir une telle fonction.

Soit je suis completement largé, soit, comme d'habitude, on ne peut vraiement pas faire confiance en Microsoft, même pour un bièce de calcul débile.

 Je cherche (je rage), déja,  depuis une heure comment faire ce simple arrondi.
Si il existe une autre méthode, je suis  intéressé.

Merci

A++

.oO° Microsoft, il y a mieux, mais c'est moins cher...
Commenter la réponse de skupiewski
Rhend
Messages postés
43
Date d'inscription
lundi 20 octobre 2008
Dernière intervention
14 juin 2009
- 16 févr. 2009 à 15:57
0
Merci
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.
Commenter la réponse de Rhend

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.