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

Comment se fait-il que la division de deux nombres int de 32 bits comme (int / int) me renvoie 0 , mais si j’utilise Decimal.Divide() j’obtiens la bonne réponse? Je ne suis pas du tout ac # guy.

int est un type entier; la division de deux ints effectue une division entière , c’est-à-dire que la partie fractionnaire est tronquée car elle ne peut pas être stockée dans le type de résultat (également int !). Decimal , en revanche, a une partie fractionnaire. En Decimal.Divide , vos arguments int sont convertis implicitement en s Decimal .

Vous pouvez appliquer une division non entière sur les arguments int convertissant explicitement au moins un des arguments en un type à virgule flottante, par exemple:

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

Dans le premier cas, vous effectuez une division entière, le résultat est donc tronqué (la partie décimale est 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 un nombre décimal. Ils ne sont donc 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 entière . Decimal.Divide d’autre part prend deux parameters du type Decimal , de sorte que la division sera effectuée sur des valeurs décimales plutôt que des valeurs entières. C’est équivalent à ceci:

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

Pour examiner cela, vous pouvez append les lignes de code suivantes après chacun des exemples ci-dessus:

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

La sortie dans le premier cas sera

 0 System.Int32 

..et dans le second cas:

 0,5 System.Decimal 

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 un entier et renvoie 0

Vous voulez lancer les numéros:

double c = (double) a / (double) b;

Remarque: Si l’un des arguments de C # est un double, une double division est utilisée, ce qui donne un double. Donc, ce qui suit fonctionnerait aussi:

double c = (double) a / b;

voici un petit programme:

 static void Main(ssortingng[] args) { int a=0, b = 0, c = 0; int n = Convert.ToInt16(Console.ReadLine()); ssortingng[] arr_temp = Console.ReadLine().Split(' '); int[] arr = Array.ConvertAll(arr_temp, Int32.Parse); foreach (int i in arr) { if (i > 0) a++; else if (i < 0) b++; else c++; } Console.WriteLine("{0}", (double)a / n); Console.WriteLine("{0}", (double)b / n); Console.WriteLine("{0}", (double)c / n); Console.ReadKey(); } 

Si vous cherchez 0

La réponse comme telle est très proche, mais je pense qu’il convient d’append qu’il existe une différence entre l’utilisation du double et du décimal.

Je ne ferais pas un meilleur travail pour expliquer les concepts que Wikipedia, alors je fournirai simplement les indications suivantes:

arithmétique à virgule flottante

type de données décimal

Dans les systèmes financiers, il est souvent nécessaire de pouvoir garantir un certain nombre d’exactitude des décimales (base 10). Ceci est généralement impossible si les données d’entrée / source sont en base 10, mais nous effectuons l’arithmétique en base 2 (car le nombre de décimales nécessaires à l’expansion décimale d’un nombre dépend de la base; un tiers prend une infinité de décimales) place à exprimer en base 10 comme 0.333333 …, mais il ne faut qu’une décimale dans la base-3: 0,1).

Les nombres à virgule flottante sont plus rapides à utiliser (en termes de temps de calcul, au niveau de la programmation, ils sont également simples) et préférés lorsque vous souhaitez minimiser les erreurs d’arrondi (comme dans les applications scientifiques).