如何用c语言计算小数点后位数

#include"stdio.h"#include"conio.h"voidmain()/*计算小数后位数*/{floatnumber=100.25432;inttemp... #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();
}
float表示的小数不准确,怎样才能解决这个问题。难道这个问题无解?
展开
 我来答
百度网友fc027fc
推荐于2017-09-21 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3160
采纳率:83%
帮助的人:753万
展开全部

这个要看小数按什么格式输入。

如果按%s输入,也就是按字符串格式输入,先找到小数点的位置,然后统计下小数点后数字的长度。

具体实现可参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[])
{
    char a[128];
    while(scanf("%s",a)!=EOF)
    {
        if(strstr(a,".")!=NULL)
        printf("%d\n",strlen(strstr(a,".")+1));
        else 
        printf("0\n");
    }
    system("pause");
    return 0; 
}

如果按%f(对应float类型小数)或者%lf(double类型的小数)方式读入,则需要先去掉整数部分,然后看小数部分一直乘10减去整数部分,知道等于0,统计,乘了几次10,但是由于浮点数在计算机中存的并不是准确值,这个往往得不到正确的结果。可以使用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);
        if(strstr(a,".")!=NULL)
        printf("%d\n",strlen(strstr(a,".")+1));
        else 
        printf("0\n");
    }
    system("pause");
    return 0; 
}

这是最后一个已经出现错误,所以遇到要精确判断小数点的位数,最好直接按字符串读入,这和图灵机的工作原理暗暗相合。

townsin
推荐于2017-09-25 · TA获得超过452个赞
知道小有建树答主
回答量:594
采纳率:50%
帮助的人:504万
展开全部

先变成字符串,然后再求(纯手打未测试)

#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);
    }
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cjj796
2013-09-16 · TA获得超过8702个赞
知道大有可为答主
回答量:1.3万
采纳率:68%
帮助的人:3356万
展开全部

将 float 类型变为 double 类型,你试试吧:

    double number=100.25432;
    double temp;


原来你的目的不是改你的程序,那求小数位数的方法太多了

更多追问追答
追问
单片机里没有double,double会被强制转成float,再说double其实也不准确。对,就是求小数点后位数。
追答

你可以看到,double 类型输出和 float 类型输出的对比;

我不知道你要精确到什么程度;

关于其它的方法再讨论!!

  double 类型

  float 类型

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式