[英]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.