web-dev-qa-db-fra.com

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 par (int/int) me renvoie 0, mais si j'utilise Decimal.Divide(), la réponse est correcte? Je ne suis en aucun cas un c # guy.

93
user4903

int est un type entier; La division de deux ints effectue une division integer, 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 appelant Decimal.Divide, vos arguments int sont convertis implicitement en Decimals.

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

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

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.

6
Andrew Rollings

La ligne suivante:

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

... sera effectué en utilisant arithmétique entière . Decimal.Divide, d'autre part, prend deux paramètres de type Decimal, de sorte que la division sera effectuée sur des valeurs décimales plutôt que sur des valeurs entières. C'est l'équivalent de ceci:

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

Pour examiner cela, vous pouvez ajouter les lignes de code suivantes 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 second cas:

0,5
System.Decimal
4
Fredrik Mörk

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

2
Gishu

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 pour obtenir un double. Donc, ce qui suit fonctionnerait aussi:

double c = (double) a/b;

voici un petit programme: 

static void Main(string[] args)
        {
            int a=0, b = 0, c = 0;
            int n = Convert.ToInt16(Console.ReadLine());
            string[] 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();
        }
1
Jaydeep Shil

Dans mon cas, rien n'a fonctionné ci-dessus.

ce que je veux faire, c'est diviser 278 par 575 et multiplier par 100 pour trouver le pourcentage.

double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);

%: 48,3478260869565 -> 278/575 ---> 0 %: 51,6521739130435 -> 297/575 ---> 0

si je multiplie le nombre PeopleCount par 1,0, cela le rend décimal et la division sera 48,34 ... multiplie également par 100,0 et non 100.

0
Alp Altunel

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.

0
Brian