【问题标题】: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:您只是在猜测和“解决”问题并不能帮助提问者学习如何提出更好的问题。
  • (我承认这是非常极端的编辑,但这是初学者的常见错误,我认为值得一试)

标签: c division integer-division


【解决方案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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-12
            • 1970-01-01
            相关资源
            最近更新 更多