为什么这个除法导致零?

时间:2009-10-14 19:06:49

标签: c division integer-division

当我遇到以下问题时,我在C中编写了这段代码。

#include <stdio.h>
int main()
{
   int i=2;
   int j=3;
   int k,l;
   float a,b;
   k=i/j*j;
   l=j/i*i;
   a=i/j*j;
   b=j/i*i;
   printf("%d %d %f %f\n",k,l,a,b);
   return 0;
}

有谁可以告诉我为什么代码为第一个和第三个变量(ka)返回零?

6 个答案:

答案 0 :(得分:11)

你问为什么k和a显示为零?这是因为在整数除法中2/3 = 0(小数部分被截断)。

答案 1 :(得分:7)

我认为您遇到的是整数算术。您正确地认为lb为2,但错误地认为ka将为3,因为它是相同的操作。但事实并非如此,它是整数运算(而不是浮点运算)。所以,当你i / j(请考虑使用一些空格)时,2/3 = 0.33333 ... 会被投射到int ,从而变为0.然后我们相乘再次增加3,并且0 * 3 = 0。

如果您将ij更改为float s(或使用(float)强制转换您的数学运算),这将符合您的预期。

答案 2 :(得分:5)

你还没有说出你得到的或你期望的东西,但在这种情况下,它可能很容易猜到。当你做'a = i / j * j'时,你期望结果大致为.2222(即2/9),但你得到0.0。这是因为i和j都是int,所以乘法和(关键)除法是在整数数学中完成的,得到0.你将结果赋值给float,然后将0转换为0.0f。

要解决此问题,请在除法之前将至少一个操作数转换为浮点数:a = (float)i/j*j);

答案 3 :(得分:4)

这是由于c编译器如何处理div中的int:

 #include <stdio.h>
int main()
{
int i=2;
int j=3;
int k,l;
float a,b;
k=i/j*j; // k = (2/3)*3=0*3=0
l=j/i*i; // l = (3/2)*2=1*2=2
a=i/j*j; // same as k
b=j/i*i; // same as b
printf("%d %d %f %f/n",k,l,a,b);
return 0;
}

答案 4 :(得分:3)

如果您问为什么k和a为0:i/j*j(i/j)*j相同。由于j大于i,i/j为0(整数除法)。 0*j仍为0,因此结果(k)为0.这同样适用于a的值。

答案 5 :(得分:0)

只要使用

,变量是否为float都无关紧要

整数/整数,您将得到0,

但是由于您使用的是浮点输出,因此您会得到0.0