c - 尽管使用 float 数据类型,乘法始终会导致 0
问题描述
#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 的值时,我仍然得到 0 作为我的税收输出,即使我使用了float
数据类型。
解决方案
在表达式5 / 100 * income
中,乘法运算符*
和除法运算符/
具有相同的优先级,并且从左到右分组。所以它解析为(5 / 100) * income
子表达式5 / 100
具有除法运算符的整数参数,因此结果被截断为整数。这导致 0。
如果您将任一操作数(或两者)更改为浮点常量,即5.0 / 100
,5 / 100.0
或5.0 / 100.0
,则会发生浮点除法,您将获得预期的结果。
20 / 100
并30 / 100
有同样的问题,所以将它们分别更改为20.0 / 100
和30.0 / 100
。
或者完全摆脱除法并使用常量0.05
,0.2
和0.3
。
推荐阅读
- c# - C# BigInteger 与 Decimal 结果
- regex - 如何使用 Powershell 从多行中选择字符串
- .net - 无法通过 TLS 1.2 连接 .NET 客户端
- ios - Watch Extension 找不到要运行的模拟器
- entity-framework - Entityframeworkcore Include 方法不起作用。急切加载延迟加载无法正常工作
- amazon-web-services - AWS Batch 与 Spring Batch
- ruby - Ruby问号运算符,这是什么意思?
- npm - 要求用户输入 npm 脚本的值
- java - 使用jsoup POST方法从java代码调用onclass点击事件 - 事件未触发
- javascript - 如何在我自己的网站上获取我所有的 Blogger 帖子?