为啥这个除法结果为零?

Posted

技术标签:

【中文标题】为啥这个除法结果为零?【英文标题】:Why does this division result in zero?为什么这个除法结果为零? 【发布时间】:2009-10-14 19:06:48 【问题描述】:

当我遇到以下问题时,我正在用 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)的代码返回零?

【问题讨论】:

您遇到了什么错误?你期望输出是什么?你得到什么输出? 请注意,您使用的是 /n 而不是 \n。这是您的代码的复制粘贴,还是您重新输入了它?最好有一个复制粘贴以避免转录错误。 我已将标题/问题更改为我认为的意图 @therefromhere:您只是在猜测和“解决”问题并不能帮助提问者学习如何提出更好的问题。 (我承认这是非常极端的编辑,但这是初学者的常见错误,我认为值得一试) 【参考方案1】:

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

【讨论】:

扩展,当你写“a = ;”使用“a”声明的浮点数,只有 result 被强制转换为浮点数。由于您的表达式中的所有值和变量都是整数,因此结果都是基于整数运算。 这也适用于 a,因为他在那里做同样的操作 (i/j == (int)2/(int)3 == 0)【参考方案2】:

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

如果您将 ij 更改为 floats(或在您的数学中添加 (float) 演员表),这将达到您的预期。

【讨论】:

【参考方案3】:

您还没有说出您得到什么或期望什么,但在这种情况下,您可能很容易猜到。当您执行 'a=i/j*j' 时,您期望结果大约为 0.2222(即 2/9),但实际上您得到的是 0.0。这是因为 i 和 j 都是 int,所以乘法和(至关重要的)除法是在整数数学中完成的,产生 0。你将结果分配给一个浮点数,这样 0 就会被转换为 0.0f。

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

【讨论】:

【参考方案4】:

这是由于 c 编译器如何在除法中处理 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;

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

不管你的变量是不是float,只要你在使用

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

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

【讨论】:

以上是关于为啥这个除法结果为零?的主要内容,如果未能解决你的问题,请参考以下文章

Int除法:为啥1/3 == 0的结果?

int除法:为啥1/3 == 0的结果?

excel2007除法结果为啥只有整数,怎样才能保留两位小数?

java做除法运算,为啥除不开时也会得到整数呢

Oracle中计算除法——解决除数为零报错

在C中除以整数将值向下舍入/结果为零