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.
Réponses
Trop de publicités?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 Decimal
s.
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;
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.
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