发一个浮点数转字符串的函数(用于给单片机1602显示)
本帖最后由 huangxinji8 于 2012-10-10 23:48 编辑自己写的,我也是刚学习程序,还是一个菜鸟,故把自己写的程序发出来,欢迎各位大侠指出哪里写的不好的
程序如下:
/**********************************************************
*函数名:void float32_to_str(float Num, UINT8 n, UINT8 u8Char[])
*功能: 把一个单精度浮点数转化为字符串
*入口参数:float Num, UINT8 n, UINT8 u8Char[]
*返回参数:无
*说明: Num:预转化的数据;u8Char[]:用于储存转化后的字符串
* n: 精确到小数点多少位
***********************************************************/
void float32_to_str(float Num, UINT8 n, UINT8 u8Char[])
{
UINT8u8_digit = 0; //数据的位数
UINT8i = 0;
UINT32 int32_temp= 0;
floatf32_temp = 0.0;
f32_temp = Num < 0 ? (-Num) : (Num); //取出NUM的绝对值存于f32_temp中
for (i=0; i<n; i++) //将要显示的内容化为整数
{
f32_temp *= 10.0; //将浮点数扩大10的n次方倍
}
int32_temp = (UINT32)f32_temp; //将扩大后的浮点数转成长整型存于int32_temp中
printf_char(1, 10, int32_temp + '0');
/*把浮点数从低位开始转化为字符串*/
i = 0;
u8_digit = 0;
do{
if ((n != 0) && (i == n)) //存入小数点
{
u8Char = '.';
}
else
{
u8Char = '0' + int32_temp % 10; //从最低位储存
int32_temp = int32_temp / 10;
}
u8_digit++; //计算数据位数即字符串的长度
i++;
}while (int32_temp != 0);
/*对绝对值小于1的数进行补零*/
if ((Num > -1.0) && (Num < 1.0))
{
for (i=0; i<(n-u8_digit); i++)
{
u8Char = '0';
}
u8Char = '.'; //补零和小数点(0.)
u8Char = '0';
u8_digit += 2 + n - u8_digit;
}
/*加上符号位*/
if(Num < 0)
{
u8Char = '-'; //在字符串末尾加上负号标志
u8_digit++; //字符串长度加1
}
/*把u8Char中的字符串高低位对调*/
for (i=0; i < (u8_digit / 2); i++)
{
UINT8 u8_temp; //中介
u8_temp = u8Char;
u8Char = u8Char;
u8Char = u8_temp;
}
u8Char = '\0'; //字符串结尾补充一个'\0'
}
*注:程序中的 UINT8 为 unsigned char 类型
UINT32为 unsigned long 类型
我以前试图写,直到听说有个函数叫sprintf()..... bigallium 发表于 2012-10-10 23:51 static/image/common/back.gif
我以前试图写,直到听说有个函数叫sprintf().....
{:3_57:} 哦,这么神奇,在kiel里可以用吗? huangxinji8 发表于 2012-10-10 23:57 static/image/common/back.gif
哦,这么神奇,在kiel里可以用吗?
标准C库函数..#include "stdio.h"即可
编辑:少了个"." huangxinji8 发表于 2012-10-10 23:57
哦,这么神奇,在kiel里可以用吗?
可以用 3050311118 发表于 2012-10-11 00:00 static/image/common/back.gif
可以用
{:sweat:} 那我不白花这么多时间写了 你的程序应该比那个小点{:smile:} as9901 发表于 2012-10-11 08:14 static/image/common/back.gif
你的程序应该比那个小点
呵呵,谢谢
假如输入的float整数部分已经超过了液晶显示长度怎么办?
我觉得倒不如控制它显示几个有效数字比较合适,能完整显示的话就直接显示,不能显示完的话就用科学记数法显示。
例如12345600000000000000.0,明显1602一行不能完整显示,那就显示成1.23456 E19.
假如是123456.0,那就直接显示成123456.
嘛,float类型的话也就只有7位有效数字。。。
另外还有一个问题,对于1.234567,假如你要显示5位小数,那你的输出是1.23456,但是正确来说应该是1.23457
这个需要考虑四舍五入。 先取整数,小数就看有多少位,乘100、1000等转成整数,再显示 devcang 发表于 2012-10-12 17:18 先取整数,小数就看有多少位,乘100、1000等转成整数,再显示
哇,这乃是一个困扰我的问题,非常感谢您的提醒,真是一语惊喜梦中人啊,这样就能精确到小数点后更多的数了 bennyhuang 发表于 2012-10-12 09:06 假如输入的float整数部分已经超过了液晶显示长度怎么办? 我觉得倒不如控制它显示几个有效数字比较合适,能 ...
这些都是我没考虑到的,感谢您的提醒,我会改进的 本帖最后由 ansion520 于 2013-8-2 20:13 编辑
printf_char 函数做啥用!???在Keil 下无法编译!? ansion520 发表于 2013-8-2 20:09 static/image/common/back.gif
printf_char 函数做啥用!???在Keil 下无法编译!?
这句调试的时候弄上去的,忘记删掉了,直接删掉得了,建议用sprintf函数
页:
[1]