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

#include"stdio.h"#include"conio.h"voidmain()/*计算小数点后位数*/{floatnumber=100.25432;inttem... #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,他并不能精确的表达小数,那我应该怎么求小数点后位数呢。
展开
 我来答
潘达lya
推荐于2017-12-15 · TA获得超过1475个赞
知道小有建树答主
回答量:509
采纳率:0%
帮助的人:429万
展开全部
float以10进制只有7个有效数字,如果你存的数大于7位那么一定会不准确,小于7位的就准确,其实float只有前7位有意义,有时会只有6位有意义。。。 也就是说你只用用7-整数位数就行,如果整数位为0,那么你只需要7+第一个不是0的小数所在位置即可,即此时小树位数是大于7的,但有效数字个数仍然是7。。。。
追问
是这样的。
金色潜鸟
2013-09-17 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5278万
展开全部
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进制截断误差问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
迷岳9
2013-09-16
知道答主
回答量:39
采纳率:0%
帮助的人:20.9万
展开全部
C语言没有库函数来处理这类问题,你必须自己写函数处理。。。
在java中,有个效率低下的BigDecimal类来处理这个问题,这个类直接把字符串转化成数字的,你可以参考下。。。
追问
我也听说过java中有个BigDecimal,但是我没学过java,so不会~,就是不会写这个函数所以才拜托各位大神呢
不过你能懂我的意思,并且还热心回答了,虽然对我解决问题没有太大帮助,要是没有别人回答的话,我就采纳你的了
追答
用到小数时,用两个int做分母和分子,储存时回避小数问题,保留精确结果。需要得到小数结果的时候,用位移和与或非处理这两个int(具体参考cpu数值运算原理),得到精确的小数结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tattackor
推荐于2016-02-01 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:817万
展开全部

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);
    }
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jackwind1987
2013-09-16 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:445万
展开全部
C语言本身并不提供高精度的小数运算,如果需要,可以查找一下数值计算方面的资料,不同的应用场景有不同的算法来计算
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式