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