永发信息网

以下编程求输入12.36输出1,2,3,6怎么错了?

答案:2  悬赏:60  手机版
解决时间 2021-04-27 08:09
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main()
{
float inter;
int num[8];int m;
float n;
int i;
float j;
int ys;
scanf("%f",&inter);
m=(int)inter;
ys=m;
for (i=0;i<4;i++)
{
if (m>=(int)pow(10,3-i))
{
num[i]=(int)(m/pow(10,3-i));
m=m-(int)(num[i]*(int)(pow(10,3-i)));
printf("%d",num[i]);
}

}
n=inter-ys;
for (i=4;i<8;i++)
{
if (n!=0)
{
j=n*(int)(pow(10,1));
m=(int)j;
n=j-m;
printf("%d\n",m);
}
}
}
最佳答案

首先感谢你提出了这个问题,因为这个问题涉及到C语言的细节问题。平时我们根本不会


去注意。你的代码是本身是没有错误的,关键是没有考虑到C语言中float的精度问题,当你输入


12.36以后,n=inter-ys=0.36,但是在计算机内部却不是这样存储的,而是n=0.3599996567(这里


值表示了小数点后十位),当你下一步j=n*(int)pow(10,1)时,计算出来的数是3.599996567,所以循环第一次


输出地是3,后面输出是5 9 9.即使使用double类型也同样存在这个问题


我没有很好的解决方法,可以将j四舍五入,即m=(int)j;前面加上j+=0.0005,但输出的结果是1 2 3 6 0 0,


希望能有高手有更好的方法解决这个问题。

全部回答
#include <stdlib.h> void main() { char b[1001]={0}; int i = 0 ; scanf("%s",b); for( i = 0 ; i < strlen( b ) ; i++) { if( isdigit( b[i])) printf( "%c," , b[i]); } }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
白金圣兽是宠物吗?
查看FLASH
DNF 传承:幻象天使的光影剑
开一个十桌以上的火锅店需要多少钱?一年能赚
传闻中的七公主何时才原谅罗下士
爱情公寓经典语句,爱情公寓全系列中有哲理的
沈阳哪的烧烤最好吃?
有什么方法可以提升睡眠质量?
谁的手机打电话时能显示号吗所在地?帮我查一
谁能给个高考语文成语题目
环翠楼公园地下停车场地址有知道的么?有点事
农场小黑屋现在还开放么
我脾胃不好.买什么补品吃都没用,现在我是又
在什么情况下表白最有效?
什么是网络游戏实名式注册
推荐资讯
名片赞是怎么刷的,手机QQ好友名片里的已赞是
那位行家知道福田赛瑞2600厢式车多少钱?
每次爸妈一说我,我总是控制不住情绪跟他们吵
WOW带刷监狱的技能宏?说详细点。谢谢了!!!
一个这样的女孩
他是我男朋友、可为什么好几天才联系我一次呢
你不如杀了我 英文怎么拼写
极光长袍哪里出,跪求幻化!!和法师冰川长袍
达子的春天怎么下载?
淘宝网失败原因为:确认银行卡金额失败,且失
谁能详细介绍一下FM927楚天交通广播《我爱我
甘井子区道路运输协会在哪里啊,我有事要去这
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?