代碼貼上,以作記錄
/*
* 返回一個單精度浮點數的整數位個數,和小數位個數(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位就可以進行判斷了