为什么Decimal.Divide(int,int)工作,但不是(int / int)?

如何将两个32位整数作为(int / int)返回给我0 ,但如果我使用Decimal.Divide()我得到正确的答案? 我绝不是一个交stream的人。

int是一个整数types; 除两个整数执行整数除法,即小数部分被截断,因为它不能存储在结果types(也是int !)中。 相反, Decimal小数部分。 通过调用Decimal.Divide ,你的int参数被隐式转换为Decimal s。

您可以通过显式将至less一个参数强制转换为浮点types来对int参数执行非整数除法,例如:

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

在第一种情况下,你正在做整数除法,所以结果被截断(小数部分被砍掉),并返回一个整数。

在第二种情况下,整数首先转换为小数,结果是小数。 因此,他们不被截断,你得到正确的结果。

以下行:

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

…将使用整数算术执行。 Decimal.Divide另一方面需要两个Decimaltypes的参数,所以除法将在十进制值上执行,而不是整数值。 这相当于这个:

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

为了检查这个,你可以在每个上面的例子之后添加下面的代码行:

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

在第一种情况下的输出将是

 0 System.Int32 

在第二种情况下:

 0,5 System.Decimal 

我认为Decimal.Divide(decimal, decimal)在返回十进制值(精确)之前,将其2个int参数隐式转换为小数,其中4/5被视为整数除法并返回0

如果你正在寻找0 <a <1的答案,int / int是不够的。 int / int做整数除法。 尝试在操作中将其中一个int转换为double。

你想投的数字:

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

注意:如果C#中的任何参数都是双精度型,则使用双精度型,导致双精度型。 所以,下面也会工作:

双c =(双)a / b;

这里是一个小程序:

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