分数化小数(decimal)

分数化小数

①我的程序

#include<iostream>
using namespace std;
int main(void)
{
int a,b,c,kase=0;
while(scanf("%d%d%d",&a,&b,&c)!=EOF&&(a||b||c))
{
printf("Case %d: %.cf\n",++kase,(double)a/b);
}
return 0;
}

 测试

看其他数据会输出什么结果

 问题:是不是printf("Case %d: %.cf\n",++kase,(double)a/b);此句中的%.cf有问题?导致无法实现分数到小数的转换。

 解决:查资料知:保留的小数位数要手动输入时,需要自己写程序模拟保留小数位数的过程(注意四舍五入),要直接通过计算机的浮点运算来实现不太可能,即用%.cf只是主观臆测。因为这涉及到多次类型转换,而每次从高到低的类型转换都会直接截断导致数据丢失,所以只能按位输出,在需要输出的最后一位需要根据下一位的数值来判断是否进位。

 改正后:

#include<iostream>
using namespace std;
int main(void)
{
long long a,b;
int c,kase=0;
while(scanf("%lld%lld%d",&a,&b,&c)!=EOF&&(a||b||c))
{
printf("Case %d: %lld.",++kase,a/b);
a%=b;
for(int i=1;i<c;i++){
printf("%lld",a*10/b);
a=a*10%b;
} //最后一位不在循环里因为最后一位还需要判断四舍五入
if(a*10%b*10/b<5)
printf("%lld\n",a*10/b);
else
printf("%lld\n",a*10/b+1);
}
return 0;
}

 测试:

试下其他数据:

成功!

猜你喜欢

转载自www.cnblogs.com/slay/p/9326520.html