c语言 求小数的位数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 求小数的位数相关的知识,希望对你有一定的参考价值。

要求 算出浮点部分的位数!!!!!不能用数组指针。 求高手
想了好多方法,都以为精度缺失问题失败来。比如
while ((float)cpNum2>(float)(int)cpNum2)

cpNum2 *= 10;
bFlt++;

求高手给个精准算法,在线等!!!!

你写这个程序,最好去理解下 float的存储方式了:
float 在存储的时候,占32位,最高位是符号位,第30-23位为指数位,剩余是尾数位占24。
举个例子:
假设:float a=3.21;
print("%f",a);和printf("%10f",a);
输出结果肯定不相同的,因此,你想要得到精准的位数,除非要制定长度了,否则,你只能按剩余24位来计算了,注意,要去掉10进制的位数了,追问

我问的就是如何避免这种精度缺失!!!

追答

精度的缺失是必然的,计算机存储采用2进制方式存储的,任何10进制数据都会先转化为二进制方式了,然后在按照float的存储方式写到存储空间的,所以要根据你自己的需要来设计这个精度了,不然你去盖茨,也无法解决这个问题

参考技术A #include<stdio.h>
#include<string.h>
int main()
       
    int i,x,y;
char s[100];//用字符串存储浮点数
    printf("请输入浮点数:");
    gets(s);
y=strlen(s);
for(i=0;i<100;i++)

if(s[i]=='.')
x=(i+1);

y-=x;
printf("%d\\n",y);
return 0;

 看来还是没明白你的意思,呵呵

追问

原题是随机输入double类型的数转换成字符串! 貌似就不能用字符串输入浮点数了吧

追答

我不太明白你的意思,这个随机输入不是键盘随机输入一个double类型的浮点数?
然后我写的确实也是将浮点数转换成字符串来处理的。求的是浮点数小数部分的位数。不知道你到底是什么意思呢?

本回答被提问者采纳
参考技术B #include<stdio.h>   

int main()   

   

 float i=2.7765;

 int num=0;

 while(i-(int)i>0)

 

  i=i*10;

  num++;

 

 printf("%d",num);

    return 0;   

 只能这样,计算机储存浮点型数据时只储存小数点后6位,想算具体的只能用数组

追问

同学,这个方法我试过,你试试456.1234. 陷入死循环了

追答

确实有精度损失,虽然没有死循环但算的是结果是5,明显是错的,可以试试把浮点型转换成64位的longlong型(VC中为__int64)

输入的浮点型末尾不可能是零,所以结果中肯定比原来多一个0,其后的是乱的,你看看能不能根据这个进行编程

参考技术C 2.00076浮点位是几个,2.123000234浮点数是几位?也就是说你的有效位是多少?

另外比较运算使用浮点数这样不合适吧。追问

原题是随机输入double类型的数转换成字符串!我得分离浮点位的每一位数 对吧。 如果说大侠你说不适合,有没有好的办法求出浮点位数。 我就是在求教。

追答

假定有效位是MAX。将0.22000089转化为字符串输出。下面只是参考。

int i=MAX;
char s[MAX];
float d;

input d;
while( i > 0)
s[MAX-i] = d + '0';
d = d - s[MAX-i];
d = d * 10;
i --;



print s;

c语言怎么实现这个的,两位数三位数怎么保证对齐的

#define N 7
void main()  int a[N][N],i,j;
  for ( i=0;i<N;i++ ) 
    for ( j=0;j<N;j++ ) a[i][j]=0;
    a[i][0]=1;
  
  for ( i=1;i<N;i++ ) for ( j=1;j<=i;j++ ) a[i][j]=a[i-1][j-1]+a[i-1][j];
  for ( i=0;i<N;i++ ) 
    for ( j=0;j<=i;j++ ) printf("%6d",a[i][j]);
    printf("\\n\\n");
  

关键是其中%6d的输出格式,意思是输出整数一定要至少占用6个字符位置,如果不足前面补空格

另外:要后面补空格要用%-6d的格式输出

参考技术A if num<10
printf(" %d",num);//前面要有个空格
参考技术B 定义宽度一样就好了

以上是关于c语言 求小数的位数的主要内容,如果未能解决你的问题,请参考以下文章

c语言怎么实现这个的,两位数三位数怎么保证对齐的

c语言如何控制小数位数?

c语言中如何保存一个位数不限的小数?

c语言如何控制小数位数

C语言中 小数点前、后面的零怎么控制输出 比如,0.001-变为.001;200.00变为200;200.1不变。

C语言中输出时怎样控制小数点后的位数,请举例说明保留1、2、3、4位小数等等,谢谢