2010-04-01 10 views
0

Je fais des divisions simples en C#, et je suis un peu perplexe par ses subtilités. Voici du code, et dans les commentaires, le résultat.simple C# arithmétique. winForms

double result = 2/3; //gives 0 
double result = Convert.ToDouble(2)/Convert.ToDouble(3); // is good 
double result = double.Parse(2)/double.Parse(3); // gives me errors 
double result = double.Parse(2/3); // gives me errors 
double result = Convert.ToDouble(2/3); // gives 0 

MessageBox.Show(result.ToString()); 

donc si vous avez un tas d'entiers vous voulez mess avec, (BTW, si vous dites que j'ai 5 déclarations de la même variable compiler uniquement avec 1 ligne pas fait de commentaires), vous devez convertir chaque un à un double. assez pénible ...

Répondre

3

La division entière supprime le reste. Vous n'avez pas besoin d'utiliser Convert.ToDouble ou double.Parse, vous pouvez simplement écrire:

double result = 2.0/3; 

ou

double result = (double)2/3; 

Si l'un des opérandes est une valeur à virgule flottante, vous obtiendrez alors l'arithmétique en virgule flottante au lieu de l'arithmétique entière.

Pour expliquer chacun:

// 2/3 = 0 with a remainder of 2; remainder is discarded 
double result = 2/3; 

// 2.0/3.0 = 0.6667, as expected 
double result = Convert.ToDouble(2)/Convert.ToDouble(3); 

// double.Parse takes a string parameter, so this gives a syntax error 
double result = double.Parse(2)/double.Parse(3); 

// As above, double.Parse takes a string, so syntax error 
// This also does integer arithmetic inside the parentheses, so you would still 
// have zero as the result anyway. 
double result = double.Parse(2/3); // gives me errors 

// Here, the integer division 2/3 is calculated to be 0 (throw away the 
// remainder), and *then* converted to a double, so you still get zero. 
double result = Convert.ToDouble(2/3); 

espoir qui aide à expliquer.

+0

ahh merci beaucoup les gars. J'aurais dû savoir que 2/3 est tronqué donnant ainsi 0 .... J'ai aussi appris que .parse est pour les cordes. et, j'ai appris que vous pouvez taper (double) au lieu de Convert.ToDouble. gars @ – jello

+0

@Adam Robinson: Whoops, c'était une faute de frappe. Il était censé dire '(double) 2' sans le' .0', pour indiquer une distribution explicite. J'espère que je n'ai pas confondu quelqu'un d'autre que moi là-bas! – Aaronaught

2

2/3 divise deux entiers, ce qui tronque tout reste. Vous pourriez faire:

double result = 2.0/3.0; 

Cela va effectuer une double division.

double.Parse est conçu pour convertir un string à un double, pas un entier (pour que vous pouvez lancer directement comme (double)intVariable ou utiliser Convert.ToDouble(intVariable)). Si vous voulez utiliser une constante, il suffit de mettre vos chiffres dans le format 2.0 plutôt que simplement 2.

1

La raison pour laquelle la première ligne renvoie 0 est qu'il s'agit d'un comportement standard pour la division entière. Beaucoup de langages tronquent les restes, et C# est l'un d'entre eux.

La raison pour laquelle vos appels Double.Parse échouent est que l'analyse est généralement appliquée aux chaînes. L'analyse d'une valeur entière n'a pas vraiment de sens. Juste cast à doubler à la place: (double)2.