本人是个小白,还请各位不吝赐教。
代码如下
#include<stdio.h>
int main()
{
double a=0.3;
printf("a=%lf\n",a);
long long int b=(long long int)a;
a=a-(double)b;
int c;
long long int m,d;
d=0;
m=1;
int n=0;
while(a!=0)
{
a*=2;
c=(int)a;
d=d*2+c;
m*=2;
a=a-(double)c;
n++;
if(n==63) break;
}
long long int x=d;
long long int y=m;
long long int z=1;
n=1;
while(z!=0){
z=x%y;
x=y;
y=z;
n++;
}
d/=x;
m/=x;
d=d+b*m;
printf("\n%lld / %lld=%lf",d,m,(double)d/(double)m);
}
这段代码能实现部分小数转化为分数,我不需要知道怎么改,我想知道这里面求出分数的逻辑在哪,实在没看明白,感谢各位。
小数转换为分数分为2个情况,一个是循环小数
思路是将循环节除以对应位个9,比如
0.121212...,转换为 12/99 (因为循环节为2位,所以是99)
再计算最大公约数化简,得到4/33,所以就是4/33
另一个是非循环小数,那么就是小数除以1后面位数个0
比如
0.12,就是12/100
再化简,得到 3/25。
第一个while在把小数转分数,第二个while在求分子分母的公倍数,然后把第一个while得到的分子分母除以公倍数就成了分数
他这种写法基本上来说一定会出现偏差,所以没啥用