为什么Decimal.Divide(int,int)起作用,但(int / int)不能起作用?


105

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


1
您能提供一个具体的例子吗?十进制是与Int32不同的类型。
Groo 2009年

顺便说一下,我发现Decimal.Divide只接受小数作为输入。
拉维

Decimal.Divide也适用于整数作为输入。
Thamarai T

Answers:


214

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

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

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

2
好答案。我也尝试了Decimal.Divide(a,b)给出相同的结果。
巴克斯特2012年

6

在第一种情况下,您要进行整数除法,因此结果将被截断(小数部分被切掉)并返回整数。

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


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

2

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


1

您要转换数字:

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

注意:如果C#中的任何参数都是双精度,则使用双精度除法将导致双精度。因此,以下内容也可以工作:

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

0

如果您正在寻找0 <a <1的答案,则int / int将无法满足要求。int / int进行整数除法。尝试在操作内部将一个int转换为double。


1
Int32是一个有符号整数,您是说0 <answer <1吗?
Groo 2009年

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。


-1

如此标记的答案就在那儿,但是我认为值得补充的是,使用双精度和十进制之间是有区别的。

与Wikipedia相比,我在解释概念方面做得更好,因此我只提供以下指示信息:

浮点运算

十进制数据类型

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

浮点数的处理速度更快(就CPU时间而言;就编程而言,它们也同样简单),并且在希望最大程度地舍入误差时(例如在科学应用中),首选浮点数。


1
您的回复没有任何内容可以回答原始问题
LordWilmore
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.