【问题标题】:Multiplication always results in 0 despite using the float data type [duplicate]尽管使用浮点数据类型,乘法总是导致 0 [重复]
【发布时间】:2021-11-05 13:45:41
【问题描述】:
#include <stdio.h>

int main()
{
    float income;
    printf("enter your annual income here:");
    scanf("%f", &income);
    if (income < 250000)
    {
        printf("no income tax"); /* code */
    }
    else if (income >= 250000 && income < 500000)
    {
        printf("your income tax will be:%f", 5 / 100 * income);
    }
    else if (income >= 500000 && income < 1000000)
    {
        printf("your income tax will be:%f", 20 / 100 * income);
    }
    else if (income >= 1000000)
    {
        printf("your income tax will be:%f", 30 / 100 * income);
    }

    return 0;
}

当我运行代码并输入超过 250000 的值时,即使我使用了 float 数据类型,我仍然得到 0 作为我的税收输出。

【问题讨论】:

  • 5 / 100 始终为 0 - 你应该阅读整数除法
  • 试试,例如:printf("Value: %f\n", (25.0 / 100) * income);
  • @UnholySheep 是的,这就是我使用浮点数据类型的原因,所以我认为它应该适用于十进制数
  • 不——整数除法完成,产生 0,然后乘以 float,所以 0 乘以任何东西都是 0(忽略 NaN 和无穷大)。
  • 您的编译器会将5/100 分块为一个数字,该数字为零。

标签: c arithmetic-expressions


【解决方案1】:

在表达式5 / 100 * income中,乘法运算符*和除法运算符/具有相同的优先级,并且从左到右分组。所以解析为(5 / 100) * income

子表达式5 / 100 具有除法运算符的整数参数,因此结果被截断为整数。这导致 0。

如果您将任一操作数(或两者)更改为浮点常量,即5.0 / 1005 / 100.05.0 / 100.0,则会发生浮点除法,您将得到预期的结果。

20 / 10030 / 100 有同样的问题,所以将它们分别更改为 20.0 / 10030.0 / 100

或者完全摆脱除法,使用常量0.050.20.3

【讨论】:

  • 严格来说,使用5.0 / 100 将产生double 结果(因为5.0double 常量)。您可以使用5.0f / 100 生成float,或者您可以决定不要大惊小怪,因为printf() 的参数无论如何都会转换为double,因为printf() 的可变参数模板中的省略号.
  • 建议:参考operator precedenceimplicit conversions。从左到右对表达式求值是问题的关键,直到为时已晚才转换为浮点类型。
猜你喜欢
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 2018-11-08
相关资源
最近更新 更多