目录
1- 问题由来
传统double只能精确到大约16位,已经不能满足高度精确的需要。
对此需定义一种新的函数div(int m,int n,int digits)来精确计算小数点后的位数。
m是被除数,n是除数,digits是要精确的小数位数。
2- 基本思路
整数部分直接利用int取整;小数部分根据下图计算s的方法循环求出要精确的数。
3- 实践
第一代:代码冗余
#include <stdio.h>
void div(int m, int n, int digits);
int main()
{
int m, n, digits;
scanf("%d%d%d", &m, &n, &digits);
div(m, n, digits);
return 0;
}
void div(int m, int n, int digits)
{
int a,b,s;
a = m / n;
b = m % n;
if (digits == 0)
{
return printf("%d", a);
}
printf("%d.", a);
s = (m - b) / n;
m = b * 10;
b = m % n;
for (int i = 0; i < digits; i++)
{
s = (m - b) / n; printf("%d", s);
m = b * 10;
b = m % n;
}return;
}
第二代:较第一代精简一些
#include <stdio.h>
void div(int m, int n, int digits);
int main()
{
int m, n, digits;
scanf("%d%d%d", &m, &n, &digits);
div(m, n, digits);
return 0;
}
void div(int m, int n, int digits)
{
int a,b,s,m2;
a = m / n;
b = m % n;
if (digits == 0)
{
return printf("%d", a);
}
printf("%d.", a);
for (int i = 0; i < digits; i++)
{
m = b * 10;
b = m % n;
s = (m-b) / n; printf("%d", s);
}return;
}