打印
[PIC®/AVR®/dsPIC®产品]

一个OLED的显示浮点数的函数存在输出差0.01的缺陷,解决方法

[复制链接]
558|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
734774645|  楼主 | 2024-1-8 22:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 734774645 于 2024-1-10 15:32 编辑

原来的函数是这样的

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]        Display a float
* @param x  position x-axis  0 - 127
* @param y  position y-axis  0
* @param num  The order of the Chinese characters in the Hzb[] array
* @param accuracy Preserve decimal places
* @param fontsize 8/16
* [url=home.php?mod=space&uid=536309]@NOTE[/url]        
*/
void OLED_ShowFloat(uint8_t x, uint8_t y, float num, uint8_t accuracy, uint8_t fontsize)
{
        uint8_t i = 0;
        uint8_t j = 0;
        uint8_t t = 0;
        uint8_t temp = 0;
        uint16_t numel = 0;
        uint32_t integer = 0;
        float decimals = 0;

        //Is a negative number?
        if (num < 0)
        {
                OLED_ShowChar(x, y, '-', fontsize);
                num = 0 - num;
                i++;
        }

        integer = (uint32_t)num;
        decimals = num - integer;

        //Integer part
        if (integer)
        {
                numel = (uint16_t)integer;

                while (numel)
                {
                        numel /= 10;
                        j++;
                }
                i += (j - 1);
                for (temp = 0; temp < j; temp++)
                {
                        OLED_ShowChar(x + 8 * (i - temp), y, integer % 10 + '0', fontsize); // 显示整数部分
                        integer /= 10;
                }
        }
        else
        {
                OLED_ShowChar(x + 8 * i, y, temp + '0', fontsize);
        }
        i++;
        //Decimal part
        if (accuracy)
        {
                OLED_ShowChar(x + 8 * i, y, '.', fontsize);

                i++;
                for (t = 0; t < accuracy; t++)
                {
                        decimals *= 10;
                        temp = (uint8_t)decimals;
                        OLED_ShowChar(x + 8 * (i + t), y, temp + '0', fontsize);
                        decimals -= temp;
                }
        }
}
当我要显示28.55的时候显示成了28.54,大家猜猜是哪儿的错误。

使用特权

评论回复
评论
734774645 2024-1-10 15:32 回复TA
@mxkw0514 :是的,我打错了。是0.01 
mxkw0514 2024-1-10 09:37 回复TA
这个好像差0.01,跟楼主说的不一样 
沙发
734774645|  楼主 | 2024-1-8 22:06 | 只看该作者
经过认真研究找到了问题,并修正了这个BUG。
/**
* @brief        Display a float
* @param x  position x-axis  0 - 127
* @param y  position y-axis  0
* @param num  The order of the Chinese characters in the Hzb[] array
* @param accuracy Preserve decimal places
* @param fontsize 8/16
* @note       
*/
void OLED_ShowFloat(uint8_t x, uint8_t y, float num, uint8_t accuracy, uint8_t fontsize)
{
        uint8_t i = 0;
        uint8_t j = 0;
        uint8_t t = 0;
        uint8_t temp = 0;
        uint16_t numel = 0;
        uint32_t integer = 0;
        float decimals = 0;

        //Is a negative number?
        if (num < 0)
        {
                OLED_ShowChar(x, y, '-', fontsize);
                num = 0 - num;
                i++;
        }

        integer = (uint32_t)num;
        decimals = num - integer;

        //Integer part
        if (integer)
        {
                numel = (uint16_t)integer;

                while (numel)
                {
                        numel /= 10;
                        j++;
                }
                i += (j - 1);
                for (temp = 0; temp < j; temp++)
                {
                        OLED_ShowChar(x + 8 * (i - temp), y, integer % 10 + '0', fontsize); // 显示整数部分
                        integer /= 10;
                }
        }
        else
        {
                OLED_ShowChar(x + 8 * i, y, temp + '0', fontsize);
        }
        i++;
        //Decimal part
        if (accuracy)
        {
                OLED_ShowChar(x + 8 * i, y, '.', fontsize);
                i++;
                for (t = 0; t < accuracy; t++)
                {
                        decimals *= 10;
                        temp = (uint8_t)decimals;
            // 添加一个小的调整来处理精度问题
            if(t==accuracy-1&&decimals-temp>=0.5) temp++;
            
                        OLED_ShowChar(x + 8 * (i + t), y, temp + '0', fontsize);
                        decimals -= temp;
                }
        }
}
你看出来为何要这么做了吗?

使用特权

评论回复
板凳
xch| | 2024-1-9 18:09 | 只看该作者
为啥不用 printf 函数?

使用特权

评论回复
地板
chenqianqian| | 2024-1-10 08:12 | 只看该作者
直接转换成字符串显示

使用特权

评论回复
5
mxkw0514| | 2024-1-10 09:32 | 只看该作者
734774645 发表于 2024-1-8 22:06
经过认真研究找到了问题,并修正了这个BUG。
你看出来为何要这么做了吗?
...

请问这句t==accuracy-1&&decimals-temp>=0.5是如何消除差0.1精度的呢?没看懂。

使用特权

评论回复
6
734774645|  楼主 | 2024-1-10 13:51 | 只看该作者
chenqianqian 发表于 2024-1-10 08:12
直接转换成字符串显示

意思是用重定向到OLED?

使用特权

评论回复
7
734774645|  楼主 | 2024-1-10 13:51 | 只看该作者
mxkw0514 发表于 2024-1-10 09:32
请问这句t==accuracy-1&&decimals-temp>=0.5是如何消除差0.1精度的呢?没看懂。

你猜着是怎么个回事。

使用特权

评论回复
8
734774645|  楼主 | 2024-1-10 13:52 | 只看该作者
mxkw0514 发表于 2024-1-10 09:32
请问这句t==accuracy-1&&decimals-temp>=0.5是如何消除差0.1精度的呢?没看懂。

说实话我也看不懂,这代码是我下载的,但是显示发现了问题。在百分位超过4的时候出现了错误。然后我把代码发给GPT帮我检查,它发现了这个问题,帮我进行了修正。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

199

主题

3471

帖子

14

粉丝