求C++高手,数据类型输出问题

floatf1=75.7;floatna1,na2,na3=7,na4=5,na5;na5=(f1*10-na3*100-na4*10);cout<<na5<<endl;... float f1=75.7;
float na1,na2,na3=7,na4=5,na5;
na5=(f1*10-na3*100-na4*10);
cout<<na5<<endl;
输出为什么是6.99997
若f1改为double 输出就正常了即输出7,为什么,求详解
展开
 我来答
麒麟臂爆发了61
2012-11-26 · TA获得超过197个赞
知道小有建树答主
回答量:105
采纳率:0%
帮助的人:103万
展开全部
猜测的原因,讨论讨论而已:
这是float的精度决定的,一个浮点数float共4字节(32bit),是由s(符号域,占1个bit)、e(指数域,占8个bit)、m(小数域,占23个bit)三部分组成。
float表示的数,其大小为:(-1)^S*M*2^E。
S(由s域表示)表示的是这个数正负号;M(由m域表示)是一个介于[1,2)的小数,E(由E域表示)是一个-126~127的整数。
真正意义上决定了这个数的精度的,是M。M一共只有23bit。23个比特如果转成10进制的话也就只能表示一个7位数,换句话说,你的数字,小数点前面和小数点后面加起来不能超过7位(也就是书上说的一个float的有效数字是6~7位),并且由于2进制和10进制之间无法精确转换,这个精度还得再打折扣。
printf默认显示小数点后6位(cout应该也是这样的),你现在这个数正好在小数点后6位,并且没能精确的表示。而double的精度要高多了,虽然可能double也没能精确表示出f1,但是double可以表示小数点后10位(double的有效数字应该有12~13位吧),printf的时候根据四舍五入的舍入方式,可以正确的表示为7.
如果你对double,在printf的时候指定为 printf("%0.11f\n",na5);来输出na5,看看结果是什么。

参考文献:《深入理解计算机系统》第二章,浮点数的表示
kylukuan
2012-11-26 · 超过22用户采纳过TA的回答
知道答主
回答量:160
采纳率:0%
帮助的人:68.6万
展开全部
自动转换遵循以下规则:1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。2) 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。 a.若两种类型的字节数不同,转换成字节数高的类型b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型3) 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。4) char型和short型参与运算时,必须先转换成int型。5) 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zzzs00yzxl
2012-11-26
知道答主
回答量:23
采纳率:100%
帮助的人:3.4万
展开全部
float 是单精度浮点型的
double 是双精度浮点型的
一般为了方便,都弄成double 的,弄成double 的有一个坏处就是分配内存空间的时候,系统分配的是8个,而float系统分配的是4个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
demon101101
2012-11-26 · TA获得超过233个赞
知道答主
回答量:128
采纳率:100%
帮助的人:69.3万
展开全部
数值的精度不够!
追问
为啥不够,又不是很大的数,小数点也不多
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
anglerbug_
2012-11-26 · TA获得超过6.9万个赞
知道大有可为答主
回答量:9104
采纳率:75%
帮助的人:3482万
展开全部
类型转换的问题,看看自己开辟的空间大小够不
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式