Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2341799
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:04:34

好像没有这个函数。

理论上讲用循环乘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) |
给主人留下些什么吧!~~