繁体   English   中英

C,将浮点数拆分为单个数字

[英]C, split a floating point number into individual digits

我正在家里使用PIC微控制器18F在一个小型电子项目中工作,我正在用HiTech C18对其进行编程,该技术将用于台式电源的数字控制。

我遇到了一个问题,就是我在一个变量中有一个浮点数,比如说12.34,需要将其拆分成4个包含每个数字的变量,这样我得到Char1 = 1,Char2 = 2等,以便显示在四向七段式LED显示屏上。 该数字将始终四舍五入到小数点后两位,因此无需跟踪小数点的位置。

我试图避免在任何可能的小数点后2位以上四舍五入的情况,因为显示屏将给出电压/电流的测量值,这会影响读数的准确性。

任何有关如何进行此拆分的建议将不胜感激。

谢谢

转换为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"可以节省大量空间。

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

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

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

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

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);
}

如果存在最大值可能超出系统上长整数支持的值范围的问题,则需要修改以上解决方案。

给定小数点的稳定性:只需将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);
}  

当然还有更优雅的方法,但是这可以工作...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM