如何用c语言计算小数点后位数(float本身都无法精确)

#include "stdio.h"
#include "conio.h"
void main() /*计算小数点后位数*/
{
float number=100.25432;
int temp;
int dot_loc=0;
temp=(int)number;
while(number-temp>0)
{
number=number*10;
temp=(int)number;
dot_loc++;
printf("%f\n",number-temp);
getch();
}
printf("digits after decimal point: %d\n",dot_loc);
getch();
}
由于浮点数本身就不精确,在存数的时候就会存成100.25432130xxx,他并不能精确的表达小数,那我应该怎么求小数点后位数呢。

float以10进制只有7个有效数字,如果你存的数大于7位那么一定会不准确,小于7位的就准确,其实float只有前7位有意义,有时会只有6位有意义。。。 也就是说你只用用7-整数位数就行,如果整数位为0,那么你只需要7+第一个不是0的小数所在位置即可,即此时小树位数是大于7的,但有效数字个数仍然是7。。。。追问

是这样的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-17
100.25432 是十进制数,存入float 要先化成2进制float格式,十进制化二进制,通常化不净,于是就引入了截断误差,以至于,只有6-7位有效数字精度了。

你可以用字符串来输入和存放。
char s[30]="100.25432";
int L,k,i,n;
L = strlen(s); // 计算字符串长度, 得 9
for (i=0;i<L;i++) if (s[i]=='.') { k=i; break;}; // 找出小数点在哪里, 得 3
n = L - k - 1; // 小数点后的位数,得 5
-----
如果输入,前面添输入语句:
printf("please input 100.25432\n");
scanf("%s",s); // 读入 100.25432
接下来同样计算 L,k,n 就可以了。追问

这个不在考虑范围内,我早就想到了

追答

哦,用字符串存放 不在考虑范围。
那么用2个整型数来分别存放整数部分和小数部分,肯定也想到了,也不在考虑范围内了。

那么估计就没办法了。

因为这不单单是存放长度问题,而是 10进制变2进制,一般的数都化不净。
就像 1.0/3.0 就是 0.33333...3333, 就算是取100位,第101位后就被截断了。就算用 double,
long double 存放,还是要被截断。
C99 新引入的 16进制指数形式(例如:0xb.1ep5 这种形式)也帮助不了10进制变2进制截断误差问题。

第2个回答  2013-09-16
C语言没有库函数来处理这类问题,你必须自己写函数处理。。。
在java中,有个效率低下的BigDecimal类来处理这个问题,这个类直接把字符串转化成数字的,你可以参考下。。。追问

我也听说过java中有个BigDecimal,但是我没学过java,so不会~,就是不会写这个函数所以才拜托各位大神呢
不过你能懂我的意思,并且还热心回答了,虽然对我解决问题没有太大帮助,要是没有别人回答的话,我就采纳你的了

追答

用到小数时,用两个int做分母和分子,储存时回避小数问题,保留精确结果。需要得到小数结果的时候,用位移和与或非处理这两个int(具体参考cpu数值运算原理),得到精确的小数结果。

第3个回答  推荐于2016-02-01

1、先把浮点数变成字符串,再通过小数点确定小点后面的位数。

2、例程:

#include <stdio.h>
#include <string.h>
void main()  {
    char * ptr;
    char strFloat[20];
    float number=100.25432;
    sprintf(strFloat, "%f", number);
    ptr = strstr(strFloat, ".");
    if (ptr != NULL) {
        printf("digits after decimal point: %d\n", strlen(ptr) - 1);
    }
}

第4个回答  2013-09-16
C语言本身并不提供高精度的小数运算,如果需要,可以查找一下数值计算方面的资料,不同的应用场景有不同的算法来计算
相似回答