C,将浮点数分成单个数字

时间:2014-01-21 17:24:07

标签: c microcontroller

我正在家里使用PIC单片机18F开发一个小型电子项目,我用HiTech C18进行编程,用于台式电源的数字控制。

我遇到了一个问题,就是我在一个变量中有一个浮点数,例如12.34,需要将它拆分为4个变量,每个数字保持一个,所以我得到Char1 = 1,Char2 = 2等等显示在4路七段LED显示屏上。数字将始终四舍五入到小数点后两位,因此不需要跟踪小数点的位置。

我试图避免任何可能超过2位小数的舍入,因为显示器正在测量电压/电流,这会影响读数的准确性。

非常感谢任何关于如何进行这种拆分的建议。

由于

4 个答案:

答案 0 :(得分:3)

转换为int,然后转换为字符串。

float x;
int i = x*100;
// or i = x*100.0f + 0.5f is round to nearest desired.
if ((i < 0) || (i > 9999)) Handle_RangeProblem();
char buf[5];
sprintf(buf, "%04d", i);

在嵌入式应用程序中,许多编译器使用固定格式字符串来确定需要大型 printf()代码的哪些部分。如果代码已全部准备好使用"%f"其他地方,那么这里的直接sprintf("%f")不是问题。否则使用%04d"可能会节省大量空间。

答案 1 :(得分:3)

使用sprintf将值放入字符数组中。然后从那里挑出数字。

您可以将浮点值直接转换为文本。或者你可以乘以100,截断或舍入到int,然后将其转换为文本。

答案 2 :(得分:1)

浮点数以二进制格式存储,包括符号位,尾数和指数。浮点数可能与给定的十进制表示不完全匹配(因为浮点的base-2存储的十进制的基数为10)。将浮点数转换为十进制表示是在开始编程课程中经常分配的问题。

由于只对两位小数和有限范围的值感兴趣,因此可以使用值的固定点表示。这将减少从浮点转换为十进制到将整数转换为十进制的问题。

long
longround( float f )
{
    long  x;
    x = (long)((f*100)+.5); //round least significant digit
    return(x);
}

char*
long2char( char ca[], long x )
{
    int pos=0;
    char sign = '+';
    ca[pos] = '0';
    long v = x;
    if( v<0 ) {
        sign = '-';
        v = -v;
    }
    for( pos=0; v>0; ++pos )
    {
        ca[pos] = (v%10)+'0';
        v = v/10;
    }
    ca[pos++] = sign;
    ca[pos] = '\0'; //null-terminate char array
    //reverse string - left as exercise for OP
    return(ca);
}

如果您遇到的问题是最大值可能会超出系统上长整数支持的值范围,那么您需要修改上述解决方案。

答案 3 :(得分:0)

鉴于小数点的稳定性:只需将sprintf()浮动到具有适当格式说明符的缓冲区中,然后将字符串中的4个值轻松提取到需要它们的type中在... ...

示例

float num = 12.1234456;
char  buf[6];

int main(void)
{
    char a[2], b[2], c[2], d[2];
    int  x, y, z, w;    

    sprintf(buf, "%0.2f", num);//capture numeric into string  
    //split string into individual values   (null terminate)
    a[0] = buf[0]; a[1]=0;
    b[0] = buf[1]; b[1]=0;
    //skip decimal point
    c[0] = buf[3]; c[1]=0;
    d[0] = buf[4]; d[1]=0;  

    //convert back into numeric discretes if necessary
    x = atoi(a);
    y = atoi(b);
    z = atoi(c);
    w = atoi(d);
}  

当然有更优雅的方式,但这会有效......