我正在家里使用PIC单片机18F开发一个小型电子项目,我用HiTech C18进行编程,用于台式电源的数字控制。
我遇到了一个问题,就是我在一个变量中有一个浮点数,例如12.34,需要将它拆分为4个变量,每个数字保持一个,所以我得到Char1 = 1,Char2 = 2等等显示在4路七段LED显示屏上。数字将始终四舍五入到小数点后两位,因此不需要跟踪小数点的位置。
我试图避免任何可能超过2位小数的舍入,因为显示器正在测量电压/电流,这会影响读数的准确性。
非常感谢任何关于如何进行这种拆分的建议。
由于
答案 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);
}
当然有更优雅的方式,但这会有效......