C语言warning C4244: '*=' : conversion from 'double ' to 'float ', possible loss of data

#include<stdio.h>
#define CORPUS 100
int main(void)
{
int years;
const float SIMPLE_INTEREST = 0.1;
const float COMPOUND_INTEREST = 0.05;
float sum_Dephne,sum_Deirdre;
sum_Dephne=sum_Deirdre=CORPUS;
for(years=1;sum_Dephne>=sum_Deirdre;years++){
sum_Dephne += (sum_Dephne*SIMPLE_INTEREST);
sum_Deirdre *= (1.00+COMPOUND_INTEREST);
printf("%.2f,%.2f\n",sum_Dephne,sum_Deirdre);
}
printf("After %d years Deirdre will have more money than Dephne,then,Dephne have $%.2f,Deirdre have $%.2f.\n",years,sum_Dephne,sum_Deirdre);
return(0);
}
这边给出:

warning C4305: 'initializing' : truncation from 'const double ' to 'const float '
warning C4305: 'initializing' : truncation from 'const double ' to 'const float '
warning C4244: '*=' : conversion from 'double ' to 'float ', possible loss of data
三条警告,课时是在看不出来WHY?

double型精度比float精度高,编译器默认生成或运算的小数都是double型
警告的意思都是由double转换到float时可能会有精度损失,只是警告
建议所有float都使用double型数据
当然如果确信自己的运算都在精度范围内,可以忽略这个警告。追问

我的for循环有问题吗?貌似永远算不出来。。。

追答

的确永远也算不出来
sum_Dephne += (sum_Dephne*SIMPLE_INTEREST);
也就是
sum_Dephne = sum_Dephne + (sum_Dephne*SIMPLE_INTEREST);
也就是
sum_Dephne = sum_Dephne *(1 + SIMPLE_INTEREST);
两个表达式一样
你的意思应该是:
sum_Dephne是线性增长的,应该是这样的吧:
sum_Dephne +=CORPUS*SIMPLE_INTEREST;
这样结果是28年……

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-04-04
0.1编译器认为是double类型的,而你把它赋给float类型的,可能存在精度上的不准确,可以试一试const float SIMPLE_INTEREST = 0.1f。追问

我的for循环有问题吗?貌似永远算不出来。。。

追答

因为浮点数有精度问题所以一般不用像sum_Dephne>=sum_Deirdre这样的条件作为结束循环的条件。你可以试一试sum_Dephne-sum_Deirdre>=10^-6这样的方式试一试。

第2个回答  2015-04-04
C语言中浮点常数都是double类型的,编译器认为用float会丢失精度,
可以在常数后加一个F,指定为float型追问

我的for循环有问题吗?貌似永远算不出来。。。

追答

for循环有问题

sum_Dephne += (sum_Dephne*SIMPLE_INTEREST);
也就是:sum_Dephne= sum_Dephne + sum_Dephne*SIMPLE_INTEREST
也即是:sum_Dephne *= (SIMPLE_INTEREST+1)
// sum_Dephne=100*1.1 , sum_Dephne越来越大
sum_Deirdre *= (1.00+COMPOUND_INTEREST);
// sum_Deirdre=100*0.05 //越来越小

所以,sum_Dephne>=sum_Deirdre这个永远成立