搜索
bottom↓
回复: 13

发一个浮点数转字符串的函数(用于给单片机1602显示)

[复制链接]

出0入0汤圆

发表于 2012-10-10 23:45:41 | 显示全部楼层 |阅读模式
本帖最后由 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[])
{
        UINT8  u8_digit        = 0;                                                     //数据的位数
        UINT8  i                  = 0;
        UINT32 int32_temp  = 0;
        float  f32_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[u8_digit + i] = '0';       
                }

                u8Char[u8_digit + i] = '.';                          //补零和小数点(0.)
                u8Char[u8_digit + i + 1] = '0';
               
                u8_digit += 2 + n - u8_digit;
        }

        /*加上符号位*/
        if(Num < 0)
        {
                u8Char[u8_digit] = '-';                                  //在字符串末尾加上负号标志
                u8_digit++;                                  //字符串长度加1
        }
       
        /*把u8Char中的字符串高低位对调*/
        for (i=0; i < (u8_digit / 2); i++)
        {
                UINT8 u8_temp;                                  //中介
                u8_temp = u8Char;
                u8Char = u8Char[u8_digit - i - 1];
                u8Char[u8_digit - i - 1] = u8_temp;        
        }
       
        u8Char[u8_digit] = '\0';                                    //字符串结尾补充一个'\0'                       
}




*注:程序中的 UINT8    为 unsigned char 类型
              UINT32  为 unsigned long 类型
         

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-10-10 23:51:49 | 显示全部楼层
我以前试图写,直到听说有个函数叫sprintf().....

出0入0汤圆

 楼主| 发表于 2012-10-10 23:57:15 | 显示全部楼层
bigallium 发表于 2012-10-10 23:51
我以前试图写,直到听说有个函数叫sprintf().....

哦,这么神奇,在kiel里可以用吗?

出0入0汤圆

发表于 2012-10-11 00:00:20 | 显示全部楼层
huangxinji8 发表于 2012-10-10 23:57
哦,这么神奇,在kiel里可以用吗?


标准C库函数..#include "stdio.h"即可

编辑:少了个"."

出0入0汤圆

发表于 2012-10-11 00:00:53 来自手机 | 显示全部楼层
huangxinji8 发表于 2012-10-10 23:57
哦,这么神奇,在kiel里可以用吗?

可以用                  

出0入0汤圆

 楼主| 发表于 2012-10-11 00:11:18 | 显示全部楼层
3050311118 发表于 2012-10-11 00:00
可以用

那我不白花这么多时间写了

出0入0汤圆

发表于 2012-10-11 08:14:37 | 显示全部楼层
你的程序应该比那个小点

出0入0汤圆

 楼主| 发表于 2012-10-12 08:23:02 | 显示全部楼层
as9901 发表于 2012-10-11 08:14
你的程序应该比那个小点

呵呵,谢谢

出0入0汤圆

发表于 2012-10-12 09:06:17 | 显示全部楼层
假如输入的float整数部分已经超过了液晶显示长度怎么办?

我觉得倒不如控制它显示几个有效数字比较合适,能完整显示的话就直接显示,不能显示完的话就用科学记数法显示。
例如12345600000000000000.0,明显1602一行不能完整显示,那就显示成1.23456 E19.
假如是123456.0,那就直接显示成123456.
嘛,float类型的话也就只有7位有效数字。。。

另外还有一个问题,对于1.234567,假如你要显示5位小数,那你的输出是1.23456,但是正确来说应该是1.23457
这个需要考虑四舍五入。

出0入0汤圆

发表于 2012-10-12 17:18:19 | 显示全部楼层
先取整数,小数就看有多少位,乘100、1000等转成整数,再显示

出0入0汤圆

 楼主| 发表于 2012-10-13 02:05:15 来自手机 | 显示全部楼层
devcang 发表于 2012-10-12 17:18 先取整数,小数就看有多少位,乘100、1000等转成整数,再显示

哇,这乃是一个困扰我的问题,非常感谢您的提醒,真是一语惊喜梦中人啊,这样就能精确到小数点后更多的数了

出0入0汤圆

 楼主| 发表于 2012-10-13 02:06:46 来自手机 | 显示全部楼层
bennyhuang 发表于 2012-10-12 09:06 假如输入的float整数部分已经超过了液晶显示长度怎么办? 我觉得倒不如控制它显示几个有效数字比较合适,能 ...

这些都是我没考虑到的,感谢您的提醒,我会改进的

出0入0汤圆

发表于 2013-8-2 20:09:18 | 显示全部楼层
本帖最后由 ansion520 于 2013-8-2 20:13 编辑

printf_char 函数做啥用!???在Keil 下无法编译!?

出0入0汤圆

 楼主| 发表于 2013-9-3 21:47:16 | 显示全部楼层
ansion520 发表于 2013-8-2 20:09
printf_char 函数做啥用!???在Keil 下无法编译!?

这句调试的时候弄上去的,忘记删掉了,直接删掉得了,建议用sprintf函数
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表