【问题标题】:C program division error?C程序分割错误?
【发布时间】:2014-02-25 01:27:47
【问题描述】:

当我运行以下代码时,我得到了加法、减法、乘法的正确答案,但除法给出了错误的答案:

#include<stdio.h>
#include<conio.h>

int main()
{
    int num1, num2, add, sub, mul, div;
    printf("Enter numbers \n");
    scanf_s("%d %d", &num1, &num2);

    add = num1 + num2;
    sub = num1 - num2;
    mul = num1 * num2;
    div = (float)(num1 / num2);   // typecasting

    printf("Addition answer = %d \n", add);
    printf("Subtraction answer = %d \n", sub);
    printf("Multiplication answer = %d \n", mul);
    printf("Division answer = %.2f \n", div);

    _getch();
    return 0;
    }

Division = 0.00 的原因是什么??

【问题讨论】:

  • 请注意,&lt;conio.h&gt; 不是标准的 C 标头。它特定于您的实现(例如,在 Posix 或 Linux 系统上不存在)
  • 养成在编译器中启用所有警告并学习如何使用调试器的习惯

标签: c


【解决方案1】:
float num1, num2, add, sub, mul, div;

必须是浮点数,否则会下降到 0.00

或者你需要用浮点数投射它们

【讨论】:

    【解决方案2】:

    它正在做整数除法。即整数 - 然后转换为浮点数

    【讨论】:

      【解决方案3】:
      div = (float)(num1 / num2);   // typecasting
      

      错了,你应该强制转换操作数

      div = (float)num1 / (float)num2;
      

      当然,你应该声明

      float div;
      

      如果出现所有警告,一个好的编译器(例如 GCC 调用为 gcc -Wall -g)会注意到 printf 的差异

      实际上,您最好使用double 而不是float,因为printf(3)%.2f 需要一个double 参数...(但float 值被提升为一个double 传递参数给printf ....)

      所以你的代码实际上应该是

      double div = (double)num1 / (double)num2;
      printf("Division answer = %.2f \n", div);
      

      了解floating pointthe floating point guidewhat every programmer should know about floating point

      【讨论】:

      • .. 取决于要实现的目标
      • 无论如何我认为这可能是预期的行为+1
      • "%.2f 需要一个双重参数" 听起来有点误导(对我来说)。 - 您不必将double 与“%.2f”一起使用,因为floats 在printf() 调用的可变参数列表中被提升为double
      【解决方案4】:

      您将div 声明为整数,但将其打印为浮点数。整数和浮点数的二进制格式不一样,会导致打印错误的值。

      要么将div 声明为float,要么将其打印为整数。

      您应该使用更多警告进行构建,因为这会导致两个警告:首先将float 分配给int,然后将int 打印为float

      【讨论】:

        【解决方案5】:

        dev 定义为整数,然后以%f 格式打印。您需要将其定义为浮点数。

        【讨论】:

        • 不,作为double;见printf(3) - 但float -> double 转换会在参数传递时发生......
        【解决方案6】:
        #include<stdio.h>
        #include<conio.h>
        
        int main()
        {
        int num1, num2, add, sub, mul;
        float div;
        printf("Enter numbers \n");
        scanf_s("%d %d", &num1, &num2);
        
        add = num1 + num2;
        sub = num1 - num2;
        mul = num1 * num2;
        div = (float)(num1 / num2);   // typecasting
        
        printf("Addition answer = %d \n", add);
        printf("Subtraction answer = %d \n", sub);
        printf("Multiplication answer = %d \n", mul);
        printf("Division answer = %.2f \n", div);
        
        _getch();
        return 0;
        }
        

        【讨论】:

          【解决方案7】:

          首先,您将 div 声明为整数。所以如果你将两个浮点数的除法存储在整数变量中,那么你会得到错误的答案。

          您应该将 div 声明为浮点数。喜欢,

          float div;
          

          你的类型转换应该喜欢,

          div = (float)num1/(float) num2;
          

          那么你就会得到正确的答案。

          【讨论】:

            猜你喜欢
            • 2014-06-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-08
            相关资源
            最近更新 更多