为什么这个除法导致零?

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

#include  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 )返回零?

我认为你正在经历的是整数运算 。 你正确地假设lb为2,但错误地认为ka将是3,因为它是相同的操作。 但它不是,它是整数运算(而不是浮点运算)。 因此,当你做i / j (请考虑使用一些空格),2/3 = 0.33333 … 被转换为int并因此变为0.然后我们再次乘以3,并且0 * 3 = 0。

如果你将ij改为float (或用(float)强制转换你的数学运算),这将做你期望的。

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

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

要修复它,在除法之前将至少一个操作数转换为浮点: a = (float)i/j*j);

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

  #include  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; } 

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

无论你是变量是浮动还是没有,只要你使用它就没关系

整数/整数,你会得到0,

但是因为你使用浮点输出,你得到0.0