【问题标题】:Incorrect Floating point Output in C ProgramC程序中的浮点输出不正确
【发布时间】:2019-09-30 00:17:04
【问题描述】:

这是我的代码

#include <stdio.h>

int main() {
   float percentage;
   int sp;
   int bp;

   percentage = (sp-bp)/bp*100;

   scanf("%d %d", &sp, &bp );
   printf("%.2f%%", percentage);

   return 0;
}

示例输入:

150 85

样本输出:

76.47%

但我的输出是:

-100.00%

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 欢迎来到 SO!为什么percentage = (sp-bp)/bp*100; 在初始化值的scanf 调用之上?程序从上到下运行,所以这是对一堆未初始化的变量进行算术运算。
  • @ggorlen 这就是问题之一。还有一个问题是对整数类型执行算术并期望浮点类型的结果。

标签: c


【解决方案1】:

首先,您应该使用它们之前真正阅读这些值:

scanf("%d %d", &sp, &bp);
percentage = ...

其次,这个:

percentage = (sp-bp)/bp*100;

进行整数除法,因此其余的除法被完全丢弃,您最终会得到:

(150 - 85) / 85 == 0
0 * 100 == 0. 

在执行操作之前,您应该将除法的一端转换为float

percentage = (sp-bp)/(float)bp * 100;

正确代码:

#include <stdio.h>

int main() {
   float percentage;
   int sp;
   int bp;

   scanf("%d %d", &sp, &bp);

   percentage = (sp-bp)/(float)bp * 100;

   printf("%.2f%%", percentage);

   return 0;
}

【讨论】:

    【解决方案2】:

    解释将很快添加。

    代码

    #include <stdio.h>
    
    int main()
    {
    
       float percentage=0;
       int sp=0;
       int bp=0;
    
       scanf("%d%d", &sp, &bp );
       //printf("\n%d%d", bp,sp);
    
       percentage = (sp-bp)/(float)bp*100;
    
    
       printf("%.2f%%", percentage);
    
    
    }
    

    编辑

    解释我改变了什么

    当您使用一个scanf() 函数扫描两个整数时。 使用scanf("%d%d", &amp;sp, &amp;bp );

    只删除两个%d %d 之间的空格。 这个空白是无用的,因为带有 %d 格式说明符的scanf() 会消耗任意数量的空白。但如果您想使用%c 进行扫描,请使用它。 scanf() 使用除 %c%n%[…] 之外的所有说明符的空格。

    Jonathan Leffler answer上查看更多信息

    像这样初始化所有变量(声明和定义)

    float percentage=0;
    int sp=0;
    int bp=0;
    

    因为当我们在函数内部声明一个变量时,这不是初始化并且具有垃圾值。这可能会导致未定义的行为。请参阅C section

    假设scanf() 无法正常工作并且整数spbp 值保持默认值。如果我们不启动它们,垃圾值仍然存在。

    一次性声明和定义,并从零开始。 see more on declare define

    (float) 显式转换为除法。

    (sp-bp)/(float)bp*100;
    

    在 C 结果 number of 一个整数除以另一个整数转换为整数,并且您丢失了小数部分,因为它被截断了。 see this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多