如何用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语言本身并不提供高精度的小数运算,如果需要,可以查找一下数值计算方面的资料,不同的应用场景有不同的算法来计算

如何用c语言计算小数点后位数(float本身都无法精确)
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 != ...

如何用c语言计算小数点后位数
可以使用sprintf(str,"%g",f);,然后由于f毕竟不是准确值,还是会出现有些问题,源码如下:include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc, char* argv[]){ char a[128]; float f; while(scanf("%f",&f)!=EOF) { sprintf(a,"%g",f); ...

C语言怎么精确浮点型变量到小数点后一位,例如0.1+0.1,它就显示0.20000000...
float无法精确表示0.2,可以考虑用整型数据保存2,当成0.2来使用,比如计算0.1+0.1可以计算1+1=2,这个2就是0.2 在计算机程序设计中,浮点数是不能指望精确存储或计算的,一定有误差,可以考虑控制误差的办法解决这个问题。

C语言中怎么取得小数点后面的数
float d;d = a - (int) a; \/\/ 用这个计算取得小数点后的数 printf("%f %f\\n",a, d );

C语言 如何确定输入的float型的小数点位数
因为scanf()里不能确定精度(小数点后的位数),只能确定长度。楼上说的%2f代表小数点2位并不正确,如果你输入的是2.22,这种方式只会取到2。 你可以换一种方式输入,输入的时候不用float型,用char str[100];scanf("%s",str);,这样输进来是个字符型数组。然后你再写个函数查找小数点后多少位。

怎么在c语言中输出小数点后6位?
float 为单精度,有效数字为6~7 double 为双精度,有效数字为15~16 但他们在输出时,小数点后都有6位小数。 如: main() { int a=15; float b=123.1234567; double c=12345678.1234567; char d='p'; printf("a=%d,%5d,%o,%x\\n",a,a,a,a); printf("b=%f,%lf,%5...

关于用C语言求一个小数求小数点后面的位数多少的问题,求大神解答。_百 ...
说句实话,如果是我,我绝对不会使用这种方式来计算。因为float精确到小数点后6位。我建议你通过这样的方式来计算:不定义浮点数,而是定义字符串,然后从小数点开始计算后面的长度即可。最主要的是假设你输入一个1.123456789123456789除了使用字符串的方式你无法通过正常的浮点数数据类型来精确计算。

C语言把小数精确到后一位:比如:
int的作用是将后面计算结果强制数据类型转换为int, 换句话说舍弃小数部分:i*10=123.4(i*10)+0.5=123.9 如果原小数点后第2位>=5,这个加法会导致进位,在整数部分实现四舍五入(int)((i*10)+0.5)=(int)(123.9)=123 取整实现舍弃后续位(int)((i*10)+0.5)*0.1=12.3 2 已赞过 已踩过< 你对这个回答...

c语言,float如何打印小数点后四位(不四舍五入)?
最简单的办法,显示的时候减掉 0.00005 再输出,a = 1.23456; printf( "%.4lf", a - 0.00005 );

如何让float变量精确到小数点后两位
在C语言中,当需要控制浮点变量的输出精度到小数点后特定位数时,可以利用数据类型和格式化输出函数来实现。首先,确保你的变量是单精度(float)或双精度(double)类型,因为这些类型支持精确的小数表示。对于输出,可以借助printf函数,它允许我们指定格式化字符串,以此来控制输出的精度。在printf的格式字符串中...

相似回答