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

#include<stdio.h>#defineCORPUS100intmain(void){intyears;constfloatSIMPLE_INTEREST=0.1... #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?
展开
 我来答
eiilpux17
2015-04-04 · TA获得超过802个赞
知道小有建树答主
回答量:424
采纳率:0%
帮助的人:400万
展开全部
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年……
匿名用户
2015-04-04
展开全部
0.1编译器认为是double类型的,而你把它赋给float类型的,可能存在精度上的不准确,可以试一试const float SIMPLE_INTEREST = 0.1f。
追问
我的for循环有问题吗?貌似永远算不出来。。。
追答
因为浮点数有精度问题所以一般不用像sum_Dephne>=sum_Deirdre这样的条件作为结束循环的条件。你可以试一试sum_Dephne-sum_Deirdre>=10^-6这样的方式试一试。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
坤坤吃饭第一名
2015-04-04 · TA获得超过667个赞
知道小有建树答主
回答量:391
采纳率:66%
帮助的人:204万
展开全部
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这个永远成立
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式