为什么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
另一方面需要两个Decimal
types的参数,所以除法将在十进制值上执行,而不是整数值。 这相当于这个:
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(); }