簡體   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