c语言 double强制转换int

#include<stdio.h>intmain(){inttemp,i;doublea=2.4568;unsignedcharb[5];for(i=0;i<5;i++)... #include <stdio.h>
int main ()
{
int temp,i;
double a=2.4568;
unsigned char b[5];
for(i=0;i<5;i++)
{
temp=(int)a;
b[i]=temp+'0';
a=(a-temp)*10;
printf("%f %d\n",a,(int)a);
}
b[5]='\0';
puts(b);
}
运行结果:
4.568000 4
5.680000 5
6.800000 6
8.000000 7
10.000000 9
24567
--------------------------------
Process exited with return value 0
Press any key to continue . . .
为什么最后的8.00000和10.00000被强制转换成7和9而不是8和10;
展开
 我来答
风若远去何人留
2014-02-13 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450134
专业C/C++软件开发

向TA提问 私信TA
展开全部

这都被你发现了

首先 float double这类的数据是近似值 有精度问题 这一点你知道吧

也就是说打印出来的8.0000 未必是8.00000

在你这个例子里面 

我改了一下 改为打印出20位小数

#include <stdio.h>
int main ()
{
     int temp,i;
     double a=2.4568;
    unsigned char b[5];
 for(i=0;i<5;i++)
 {
         temp=(int)a;    
         b[i]=temp+'0';
          a=(a-temp)*10;
          printf("%.20f %d\n",a,(int)a);
 }
         b[5]='\0';
         puts(b);
}

你再运行一下看看

可以发现8.00000实际上是7.99999999999872812850 所以会是转为int的7

一般来说 要把浮点转为int 要取得最近似的值 都是采用(int)(a+0.5) 从而达到一种四舍五入的效果

众里寻他0822
2014-02-13 · TA获得超过136个赞
知道小有建树答主
回答量:263
采纳率:100%
帮助的人:253万
展开全部
2.4568不能用double精确表示,可能是一个 2.456799999....的数,具体是多少要看double的位数与表示格式。
你看到输出的是8.000000,其实在内存中表示的可能是7.999999...,所以强转int就是7;
同理:用7.999999... - 7 = 9.999999... double输出就是10,int就是9。
希望能帮到你!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shine1991
科技发烧友

2014-02-13 · 智能家居/数码/手机/智能家电产品都懂点
知道顶级答主
回答量:4.7万
采纳率:82%
帮助的人:2.3亿
展开全部
显示是8.00000,但是实际很可能是7.999999,当然截取整数部分,就成了7
所以对于这种情况,一般都要较上一个比较小的值
例如(int)(a+1e-6)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
天运宗
2014-02-13 · TA获得超过263个赞
知道小有建树答主
回答量:317
采纳率:76%
帮助的人:88.8万
展开全部
运算过程中a已经被int了,结果当然是a被int了几次,所以出现7和9。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式