在我分配dearness=(40*basic)/100 or rent=(20*basic)/100
时,在以下简单的代码中它工作正常,但是按照以下方式进行,亲属和租金的赋值语句没有效果
请暗示可能的原因。
#include "stdio.h"
#include "conio.h"
int main()
{
int salary=0,basic=0,dearness=0,rent=0;
clrscr();
printf("enter basic salary");
scanf("%d",&basic);
dearness=(40/100)*basic; //no effect
rent=(20/100)*basic; //no effect
salary=basic+dearness+rent;
printf("%d %d",dearness,rent);
printf("\n%d",salary);
getch();
return 0;
}
谢谢。
答案 0 :(得分:6)
这是因为40/100
有一个整数结果(因为两个操作数都是整数),因此是0.您需要使用浮点数代替至少一个操作数,然后将结果转换回来到int
:
dearness = (int)((40/100.0) * basic);
或只是:
dearness = (0.4 * basic);
你在问题中发现自己的另一个选择是最后执行分组。这样你就可以将较大的数字除以100,而不是立即得到0的结果:
dearness = 40 * basic / 100;
当涉及变量时,您还可以进行明确的类型转换:
dearness = ((double)foo / bar) * basic;
请记住,计算中的每个操作数都会被提升为其中的最大类型(简化),因此,如果您有int + double
,int
将在执行之前转换为double
加成。但是如果所有操作数都在类型中一致,则计算将在该类型中完成,结果也是如此。通常情况下这不是问题,但是对于大多数人而言,它通常与直觉相反,因为在某些情况下它们会突然变为0(正如您所做的那样)。
答案 1 :(得分:2)
将double
用于结果
double dearness, rent, salary;
dearness=(40.0/100)*basic;
rent=(20.0/100)*basic;
salary=basic+dearness+rent;
...
由于40/100
中的所有内容都是整数,因此将0
作为整数返回,因此结果为0
。你想要0.4
。
答案 2 :(得分:2)
在语句dearness=(40/100)*basic;
中,40/100 = 0,因为它是整数除法。
设为dearness=(40.0/100)*basic
。
答案 3 :(得分:2)
如果除法运算中的运算符都是整数,则称为整数除法,结果将被截断。
参考:What is the behavior of integer division?
在您的代码中,
dearness=(40/100)*basic; //no effect
rent=(20/100)*basic; //no effect
由于两个运算符都是整数,结果小于1,因此该分区的输出被截断为0。使其中任何一个或两个浮点都能给你正确的结果。
dearness=(40/100.0)*basic; //effective
rent=(20.0/100)*basic; //effective
答案 4 :(得分:1)
在整数除法中,40/100
和20/100
都会导致零,因为整数不能介于0和1之间。(实际上,这是整数的定义:它不能在整数之间)
因此,声明:
(40/100)*basic;
归结为:
0*basic;
等于零。
解决方案是在float或double中进行计算,或者如果你仍想使用整数,请确保在乘法后除以:
(40*basic)/100;
注意:有时您确实希望这样做。例如,对于精确的财务计算,使用浮点数或双精度数据是不合适的,因为它们的行为方式与您期望的十进制数字的行为不同。所以你按照上面的方法进行计算(总是最后进行除法)并使用%
来找到美分值。信号处理是另一个主要处理整数的区域,只是因为常用的CPU不支持硬件中的浮点运算。