好像没有这个函数。
理论上讲用循环乘10,直到变成整数为止,循环的次数就是小数点后的位数
如果是浮点数,小数的位数很难确定,因为电脑的数据都是用二进制表示的,
所以浮点数只能精确的表示 2 的整数次幂的数的组合,例如:
0.5 = 2 的 -1 次幂
0.25 = 2 的 -2 次幂
0.75 = 2 的 -1 次幂 + 2 的 -2 次幂
其他无法表示的数据,像 0.2, 0.3 等,都不能精确的表示,所以得到的位数也是不精确的
#include
#include
int Fraction(double x) //理论(数学)上的判断小数位数的方法
{
int n=0, digits=15; //最大允许小数位数精度
for(__int64 a=x; (x-a)&&(n {
n++;
printf("n=%Ld, a-x=%.18f\r\n",n,(a-x));
}
return n;
}
int main()
{
printf("a=%.18f, fraction=%d\n\n",1.12 ,Fraction(1.1 )); //不能精确表示的
printf("a=%.18f, fraction=%d\n\n",1.12 ,Fraction(1.12 )); //不能精确表示的
printf("a=%.18f, fraction=%d\n\n",1.25 ,Fraction(1.125 )); //能够精确表示的
printf("a=%.18f, fraction=%d\n\n",1.375,Fraction(1.6875)); //能够精确表示的
getchar();
return 0;
}
因为很多数都不能用浮点数精确表示,所以引起了计算结果错误
通过修改算法,在浮点数能够保证的精度范围内计算小数位数,可以得出正确的结果
#include
#include
int Fraction(double x) //修改过的判断小数位数的方法
{
int digits=15; //最大允许小数位数精度
for(__int64 a = x*pow(10,digits); ((digits>0)&&((a%10)==0)); digits--)
a/=10;
return digits;
}
int main()
{
printf("a=%.18f, fraction=%d\n\n",1.12 ,Fraction(1.1 )); //不能精确表示的
printf("a=%.18f, fraction=%d\n\n",1.12 ,Fraction(1.12 )); //不能精确表示的
printf("a=%.18f, fraction=%d\n\n",1.25 ,Fraction(1.125 )); //能够精确表示的
printf("a=%.18f, fraction=%d\n\n",1.375,Fraction(1.6875)); //能够精确表示的
getchar();
return 0;
}
后面的程序在精度范围之内可得到正确的小数位数,但是这个程序不能通用,很多情况都没考虑,
根据你的需要,要调整算法来满足精度的要求。
--------------------next---------------------
阅读(1089) | 评论(0) | 转发(0) |