在嵌入式c语言编程中,使用sprintf %f时经常出现一些莫名其妙的问题,如:打印结果为0;打印越界;死机....
在查阅了一些资料后,发现是使用嵌入式操作系统时,堆栈8字节对齐会有影响(具体详细原因我还没搞明白).......= =、
为了避免这个问题,徒手敲了一个浮点数转字符串的函数,并做了长度限制
记录如下:
/*功 能: 浮点数保留小数位数四舍五入*/
/*输入参数: 浮点数指针 , 小数位数*/
void PrecisionHandle(float *value,unsigned char Wrange)
{
int sign = 1;
if(*value < 0)
{
sign = -1;
}
*value += ((sign * pow(10,((-1) * (Wrange + 1)))) * 5);
}
/*功 能:浮点数转换成字符串*/
/*输入参数:浮点数 ,输出整数位数,小数位数,输出字符串指针,字符串长度*/
/*返回值 :-1 错误 0 正常*/
signed char FloatToString(float value,UINT8 int_width,UINT8 Wrange,UINT8 * data,UINT8 len)
{
signed char result = 0;
signed char sign = 1;
UINT8 i = 0;
int int_value = 0;
if(value < 0)
{
sign = -1;
}
if(Wrange == 0)
{
if( (int_width + 1) > len || int_width == 0)
{
result = -1;
}
int_value = (int)(sign * value );
if(sign == -1)
{
for(i = int_width;i > 0 ;i--)
{
data[i] = (int_value % 10) + '0';
int_value = int_value / 10;
}
data[0] = '-';
}
else
{
for(i = (int_width-1);i > 0 ;i--)
{
data[i] = (int_value % 10) + '0';
int_value = int_value / 10;
}
data[0] = (int_value % 10) + '0';
}
}
else
{
if( (int_width + Wrange +1) > len || int_width == 0)
{
result = -1;
}
PrecisionHandle(&value,Wrange);
int_value = (int)(sign * value * ( pow(10,Wrange)));
if(sign == -1)
{
for(i = (int_width +Wrange +1);i > 0 ;i--)
{
if(i == int_width + 1)
{
data[i] = '.';
continue;
}
data[i] = (int_value % 10) + '0';
int_value = int_value / 10;
}
data[0] = '-';
}
else
{
for(i = (int_width +Wrange);i > 0 ;i--)
{
if(i == int_width)
{
data[i] = '.';
continue;
}
data[i] = (int_value % 10) + '0';
int_value = int_value / 10;
}
data[0] = (int_value % 10) + '0';
}
}
return result;
}