101 votes

Pourquoi Decimal.Divide (int, int) fonctionne-t-il, mais pas (int / int)?

Pourquoi diviser deux nombres int de 32 bits en tant que (int / int) me renvoie 0, mais si j'utilise Decimal.Divide (), je reçois la bonne réponse? Je ne suis en aucun cas un gars.

205voto

Konrad Rudolph Points 231505

int est un type entier; la division de deux entiers effectue un entier de la division, c'est à dire la partie fractionnaire est tronqué car il ne peut pas être stocké dans le type de résultat (également int!). Decimal, en revanche, a une partie fractionnaire. En invoquant Decimal.Divide, votre int arguments obtenir converti implicitement en Decimals.

Vous pouvez appliquer la non-division entière sur int arguments explicitement casting au moins l'un des arguments à virgule flottante de type, par exemple:

int a = 42;
int b = 23;
double result = (double)a / b;

6voto

Andrew Rollings Points 8361

Dans le premier cas, vous divisez un nombre entier, le résultat est donc tronqué (la partie décimale est découpée) et un entier est renvoyé.

Dans le second cas, les ints sont d'abord convertis en décimales et le résultat est une décimale. Par conséquent, ils ne sont pas tronqués et vous obtenez le résultat correct.

4voto

Fredrik Mörk Points 85694

La ligne suivante:

int a = 1, b = 2;
object result = a / b;

...sera effectué en utilisant l'arithmétique des nombres entiers. Decimal.Divide sur l'autre main prend deux paramètres de type Decimal, de sorte que la division sera effectuée sur les valeurs après la virgule plutôt que des valeurs entières. C'est l'équivalent de ceci:

int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;

Pour examiner cette question, vous pouvez ajouter le code suivant des lignes après chacun des exemples ci-dessus:

Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());

La sortie dans le premier cas sera

0
System.Int32

..et dans le deuxième cas:

0,5
System.Decimal

2voto

Gishu Points 59012

Je pense que Decimal.Divide (decimal, decimal) convertit implicitement ses 2 arguments int en décimales avant de renvoyer une valeur décimale (précise) où 4/5 est traité comme une division entière et renvoie 0

0voto

Brian Points 1335

Si vous recherchez 0 <a <1 réponse, int / int ne suffira pas. int / int fait la division entière. Essayez de lancer l'un des entiers sur un double dans l'opération.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X