本文主要是介绍计算一个单精度浮点数的整数位个数,和小数位个数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
代码贴上,以作记录
/*
* 返回一个单精度浮点数的整数位个数,和小数位个数(10进制)*/
// float a=0.78911115;
// uint8_t b,c;
// decodefloat(a,&b,&c);
// a=0.7891111;
// decodefloat(a,&b,&c);
// a=0.789111;
// decodefloat(a,&b,&c);
// a=0.78911;
// decodefloat(a,&b,&c);
// a=0.7891;
// decodefloat(a,&b,&c);
// a=0.789;
// decodefloat(a,&b,&c);
// a=0.78;
// decodefloat(a,&b,&c);
// a=0.7;
// decodefloat(a,&b,&c);
// a=1.0;
// decodefloat(a,&b,&c);
// a=12.0;
// decodefloat(a,&b,&c);
// a=123.0;
// decodefloat(a,&b,&c);
// a=0.0;
// decodefloat(a,&b,&c);
void DecodeFloat(float data,uint8_t *intcount,uint8_t *pointcount)
{
int8_t i;
int32_t a=data;
float b=0;
char temp[16]={0};
if(data==0)
{
*intcount = 1;
*pointcount = 0;
}
if(a==0)
{
*intcount =1;
}
else
{
for(i=0;a!=0;i++)
{
a/=10;
}
*intcount =i;
}
/***********此代码输出小数位数恒等于7*****************/
// STM32 平台上单精度小数点后面精度最多达到小数点后7位,双精度16位
// a=data;
// b=data-a;
// for(i=0;b!=0;i++)//注意死循环
// {
// b*=10.0;
// a=b;
// b=a-b;
// }
// *pointcount =i;
/***********此代码输出小数位数恒等于7*****************/
a=data;
b=data-a;
sprintf(temp,"%.7f",b);//单精度10进制最多7位小数
//printf("%s\r\n",temp);
for(i=15;i>1;i--)//0、1两位固定是“0.”
{
if(temp[i]!=0)
{
if(temp[i]=='0'&&temp[i-1]!='0')
{
temp[i]=0;
break;
}
}
}
if(i==1)//没有找到有‘0’,说明就是7位,包括7位以上的小数,只取7位
*pointcount = 7;
else
*pointcount = i-2;//减去固定的两位“0.”
// printf("整数个数:%d\r\n",*intcount);
// printf("小数个数:%d\r\n",*pointcount);
}
双精度的把参数类型修改为double型,“%.7f”修改为“%.16f”,再把temp的长度加长到32位就可以进行判断了
这篇关于计算一个单精度浮点数的整数位个数,和小数位个数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!