C程序总是出现: ✀=✀ : conversion from ✀double ✀ to ✀float ✀, possible loss of data

#include<stdio.h>#define BASIC 10.00 //正常10元/小时#define LIMIT 40 //正常工作时间为40小时#define ADD 1.5 //加班期 ADD倍#define TAX 0.15 //300美元以内的税率#define TAXM 0.20 //下150美金的税率#define TAXL 0.25 //剩下的税率int main(void){ float salary_sum,tax_m,salary_j; printf("input hours:"); scanf("%d",&hours); if(hours>=40) salary_sum=BASIC*LIMIT+(hours-LIMIT)*ADD; salary_sum=BASIC*LIMIT; if (salary_sum<=300) tax_m=salary_sum*TAX; else if(salary_sum<=450) tax_m=(salary_sum-300)*TAXM+300*TAX; else (salary_sum>450) tax_m=300*TAX+150*TAXM+(salary_sum-450)*TAXL; salary_j=salary_sum-tax_m; printf("工资总额=%d,税金=%d,净工资=%d尀n",salary_sum,tax_m,salary_j); return 0;}int hours;⼀⼀ hours 工作时间-----------------------分割线---------------------------我把float改为double就没有警告了,C语言规定:(在包含两种数据类型的任何运算中,两个值都被转换成2种类型里较高的级别。)那么假设我还是用float 定义3个变量,在 我的这个警告语句中salary_sum=BASIC*LIMIT+(hours-LIMIT)*ADD;如果程序不给出提示,我如何才能知道这个句子里面,会出现类型转换?
2026年09月24日 16:27
有5个网友回答
网友(1):

两个单精度的数在相乘的时候,系统会自动先转换成double型的。BASIC*LIMIT+(hours-LIMIT)*ADD;得到的结果会自动转换成double型,而salary_sum是float型,所以会出现警告!

#include
#define BASIC 10.00 //正常10元/小时
#define LIMIT 40 //正常工作时间为40小时
#define ADD 1.5 //加班期 ADD倍
#define TAX 0.15 //300美元以内的税率
#define TAXM 0.20 //下150美金的税率
#define TAXL 0.25 //剩下的税率
int main()
{
float salary_sum,tax_m,salary_j,hours;
printf("input hours:");
scanf("%f",&hours);
if(hours>=40.0)
salary_sum=(float)(BASIC*LIMIT+(hours-LIMIT)*ADD);
salary_sum=BASIC*hours;
if(salary_sum<=300) tax_m=(float)(salary_sum*TAX);
else if(salary_sum<=450)
tax_m=(float)((salary_sum-300)*TAXM+300*TAX);
else if(salary_sum>450)
tax_m=(float)(300.0*TAX+150.0*TAXM+(salary_sum-450.0)*TAXL);
salary_j=salary_sum-tax_m;
printf("工资总额=%f,税金=%f,净工资=%f\n",salary_sum,tax_m,salary_j);
return 0;
}

网友(2):

#include
#define BASIC 10.00 //正常10元/小时
#define LIMIT 40 //正常工作时间为40小时
#define ADD 1.5 //加班期 ADD倍
#define TAX 0.15 //300美元以内的税率
#define TAXM 0.20 //下150美金的税率
#define TAXL 0.25 //剩下的税率
int main(void)
{
int hours;///声明hours变量
float salary_sum,tax_m,salary_j;
printf("input hours:");
scanf("%d",&hours);
if(hours>=40)
salary_sum=BASIC*LIMIT+(hours-LIMIT)*ADD;
else///如果不加上else会造成salary_sum=BASIC*LIMIT;语句每次都执行
salary_sum=BASIC*LIMIT;
if(salary_sum<=300)
tax_m=salary_sum*TAX;
else if(salary_sum<=450)
tax_m=(salary_sum-300)*TAXM+300*TAX;
else if(salary_sum>450)///要改成else if 因为else后面不接条件
tax_m=300*TAX+150*TAXM+(salary_sum-450)*TAXL;

salary_j=salary_sum-tax_m;
printf("工资总额=%lg,税金=%lg,净工资=%lg\n",salary_sum,tax_m,salary_j);///由于声明的是float类型 所以不能使用%d打印
return 0;
}

网友(3):

我的也有这种问题出现,把单精度的换成双精度的就不会了,hours需要定义下,输入输出控制符要与变量类型相匹配
修改后的代码:
#include
#define BASIC 10.00 //正常10元/小时
#define LIMIT 40 //正常工作时间为40小时
#define ADD 1.5 //加班期 ADD倍
#define TAX 0.15 //300美元以内的税率
#define TAXM 0.20 //下150美金的税率
#define TAXL 0.25 //剩下的税率
int main(void)
{
double salary_sum,tax_m,salary_j,hours;
printf("input hours:");
scanf("%lf",&hours);
if(hours>=40)
salary_sum=BASIC*LIMIT+(hours-LIMIT)*ADD;
//salary_sum=BASIC*LIMIT;
if (salary_sum<=300)
tax_m=salary_sum*TAX;
else if(salary_sum<=450)
tax_m=(salary_sum-300)*TAXM+300*TAX;
else
//(salary_sum>450)
tax_m=300*TAX+150*TAXM+(salary_sum-450)*TAXL;
salary_j=salary_sum-tax_m;
printf("工资总额=%lf,税金=%lf,净工资=%lf\n",salary_sum,tax_m,salary_j);
return 0;
}

网友(4):

实数默认为double型。BASIC*LIMIT+(hours-LIMIT)*ADD;他的结果是double型。

网友(5):

printf("工资总额=%d,税金=%d,净工资=%d\n",salary_sum,tax_m,salary_j);

改为
printf("工资总额=%g,税金=%g,净工资=%g\n",salary_sum,tax_m,salary_j);

找不到hours的定义语句,所以不知道scanf("%d",&hours);是否也需要修改