2010-08-17 4 views
3

Pourquoi est-ce le code suivant:Mordu par division arrondie?

Console.WriteLine(String.Format("{0:C0}", 2170/ 20)); 

rendement "109 $", tout en faisant

Console.WriteLine(Math.Round(2170/20)); 

me donne 108?

Comment puis-je obtenir 2170/20 me donner 109?

+0

' String.Format ("{0: C0}", 2170/20) 'donne' $ 108' – SLaks

+0

217/2 sera 108.5, donc comme un nombre entier, de quelle façon voulez-vous l'arrondi? –

+0

@ SLaks Je suis désolé, dans le code 2170 était représenté par une variable décimale. Je vais éditer la question – AngryHacker

Répondre

4

Lorsque vous divisez en valeurs de type intégral, telles que 2170 et 20, l'exécution effectue une division entière et rejette (tronque) la décimale.

Si vous changez un des opérandes à un float, double ou decimal (par exemple, 2170.0/20 ou 2170/20m), il effectuera une division à virgule flottante, comme on peut s'y attendre.

Par conséquent, vous devez changer pour

Console.WriteLine(Math.Round(2170.0/20)); 

EDIT

Comme ceci:

Math.Round(2170m/20, MidpointRounding.AwayFromZero) 
+0

@SLacks C'est ce que j'ai fini par implémenter, cependant, je voulais savoir pourquoi: est-ce le problème que String.Format ("{0: C0}" ... méthode utilise d'abord MidpointRounding.AwayFromZero en interne? – AngryHacker

+0

Tout d'abord, String.Format utilise StringBuilder.AppendFormat, qui à son tour utilise le remplacement de l'objet par ToString Le comportement de cette méthode est le même que celui de Math.Round lors de l'exécution de MidpointRounding.AwayFromZero. Mais la méthode n'appelle pas Math.Round. – phoog

0

Essayez Math.Round (2170,0/20,0)

Questions connexes