LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1046|回复: 6

请问如何得到一个浮点数的小数位数

[复制链接]
发表于 2004-6-13 11:54:12 | 显示全部楼层 |阅读模式
比如一个数是7.3342,那么它的小数位数就是4,怎样编程实现呢,我在VC里面做,老是得不到正确的结果,郁闷  
下面是我的代码

  1. #include "stdio.h"
  2. void main()
  3. {
  4.    float num=7.3342;
  5.    float tmp;
  6.    int count=0;//记录小数位数
  7.    tmp=num;
  8.    while(tmp>1e-6)
  9.   {
  10.       tmp=(tmp-(int)tmp)*10;
  11.       count++;
  12.   }
  13.   printf("%d\n",count);
  14. }
复制代码

好像tmp-(int)tmp在循环几次之后,本来期望他等于零然后推出循环,可是就是不行,本来该零了,却还是小数,debug时候发现的,不知道怎么解决,郁闷亚
发表于 2004-6-13 19:36:14 | 显示全部楼层
发表于 2004-6-13 22:21:59 | 显示全部楼层

简单!!

想想怎么利用atol()吧,方法有点笨,呵呵
发表于 2004-6-14 02:02:39 | 显示全部楼层
照我的理解,对于标准的float/double这个是没法做到的。
在C++中定义一个新的数据类型,使其兼容float/double倒是可能做到。
发表于 2004-6-15 10:19:59 | 显示全部楼层
用浮点型不行的,用字符串还差不多,浮点在机器内部表示有误差
比如用sscanf接收一个1.23456,放到double里成了1.2345600000000001
发表于 2004-6-15 16:49:50 | 显示全部楼层
一个能用的笨办法,(利用有效位定义计算)

  1. main()
  2. {
  3.         float         num=7.3342;
  4.         int         count=0;//记录小数位数
  5.        
  6.         char         buf[30];
  7.         char         *p;
  8.        
  9.         sprintf(&buf[0], "%f\n", num); // 转成字符串后,后面会加0, 如7.334200
  10.        
  11.         printf(buf);
  12.        
  13.         p = buf + strlen(buf);
  14.         while( *p != '.')// 去掉后面无效的0
  15.         {
  16.                 if( *p > '0' )
  17.                 {
  18.                         break;       
  19.                 }
  20.                 p--;
  21.         }

  22.         while( *p != '.')  // 计算有效位数
  23.         {
  24.                 printf("%c", *p--);
  25.                   count++;
  26.         }
  27.        
  28.         printf("count: %d\n",count);
  29. }
复制代码
发表于 2004-6-15 20:45:54 | 显示全部楼层
ecvt(), fcvt()可以将浮点数转换成字符串。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表