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

时间:2009-06-25 10:33:12

标签: c# math int divide

如何将两个32位的int数除以(int / int)返回给我0,但是如果我使用Decimal.Divide()我得到了正确的答案?我绝不是一个c#家伙。

8 个答案:

答案 0 :(得分:193)

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

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

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

答案 1 :(得分:6)

在第一种情况下,你正在进行整数除法,因此结果被截断(小数部分被截断)并返回一个整数。

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

答案 2 :(得分:4)

以下一行:

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

...将使用整数算术执行。另一方面,Decimal.Divide采用类型Decimal的两个参数,因此除法将在十进制值而不是整数值上执行。这相当于:

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

您想要投射数字:

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

注意:如果C#中的任何参数是double,则使用双倍除法,结果为double。所以,以下也适用:

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

答案 5 :(得分:0)

如果您正在寻找0&lt; a&lt; 1回答,int / int是不够的。 int / int执行整数除法。尝试将其中一个int转换为操作中的double。

答案 6 :(得分:0)

就我而言,以上均无效。

我想做的就是将278除以575,再乘以100,以找到百分比。

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

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

如果我将PeopleCount乘以1.0,将其设为小数,除法将为48.34 ... 还要乘以100.0而不是100。

答案 7 :(得分:-1)

标记的答案几乎就在那里,但我认为值得补充的是,使用double和decimal之间存在差异。

我不会比维基百科更好地解释这些概念,所以我只提供指示:

floating-point arithmetic

decimal data type

在金融系统中,通常要求我们可以保证一定数量的(基数为10)小数位精度。如果输入/源数据在base-10中,这通常是不可能的,但我们在base-2中执行算术(因为数字的十进制扩展所需的小数位数取决于基数;三分之一取无限多个小数在base-10中表示为0.333333 ...的地方,但在base-3中只需要一位小数:0.1)。

浮点数的使用速度更快(就CPU时间而言;编程方面同样简单),并且只要您想要最小化舍入误差(如在科学应用程序中),它就是首选。