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.
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 Decimal
s.
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;
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 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
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
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();
}
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.
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.