鱼C论坛

 找回密码
 立即注册
查看: 4927|回复: 16

[已解决]如何提取浮点数的每一位

[复制链接]
发表于 2019-9-26 14:59:54 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 Acrity 于 2019-9-26 17:30 编辑

小弟现在提取到一个float的数据, 要把每一位提出来,放在一个数组里发出去,格式都要六位的浮点数,如12.234  1.3456。比如接受到的1.23就不满6位要末尾补零变成1.2300,后面如果多也不要。最终希望能把12.456转换成{1,2,46,4,5,6}这样的形式(ASCII码的十进制形式),小弟对这些实在是一知半解很头疼,所以求大神帮助!
最佳答案
2019-9-26 14:59:55
好吧,改一改
#include <stdio.h>

unsigned char *parse_data(unsigned char *dest, float data)
{
        char buf[1024];
        sprintf(buf, "%f", data);
        char *p = buf;
        for(size_t i = 0; i < 6; ++i)
        {
                dest[i] = *p++;
                if(dest[i] != '.')
                        dest[i] -= '0';
        }
        dest[6] = '\0';
        return dest;
}

int main(void)
{
        unsigned char buf[1024];
        parse_data(buf, 12.456f);
        for(size_t i = 0; i < 6; ++i)
                printf("%d ", buf[i]);
        printf("\n");
        
        parse_data(buf, 12.6f);
        for(size_t i = 0; i < 6; ++i)
                printf("%d ", buf[i]);
        printf("\n");
        return 0;
}
1 2 46 4 5 6
1 2 46 6 0 0
请按任意键继续. . .

最佳答案

查看完整内容

好吧,改一改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-26 14:59:55 | 显示全部楼层    本楼为最佳答案   
好吧,改一改
#include <stdio.h>

unsigned char *parse_data(unsigned char *dest, float data)
{
        char buf[1024];
        sprintf(buf, "%f", data);
        char *p = buf;
        for(size_t i = 0; i < 6; ++i)
        {
                dest[i] = *p++;
                if(dest[i] != '.')
                        dest[i] -= '0';
        }
        dest[6] = '\0';
        return dest;
}

int main(void)
{
        unsigned char buf[1024];
        parse_data(buf, 12.456f);
        for(size_t i = 0; i < 6; ++i)
                printf("%d ", buf[i]);
        printf("\n");
        
        parse_data(buf, 12.6f);
        for(size_t i = 0; i < 6; ++i)
                printf("%d ", buf[i]);
        printf("\n");
        return 0;
}
1 2 46 4 5 6
1 2 46 6 0 0
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-26 15:25:47 | 显示全部楼层
嘛。有点着急的,老板一直在催,求大神速码,能用立马悬赏!小弟在此谢过!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-26 19:42:37 | 显示全部楼层
你把浮点数转化成字符串型,然后判断是不是6位,多了就去掉最后几位,少了就补零,然后将字符串作为迭代对象逐个输出到列表就完了,如果遇到小数点,就变成数字46
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-26 20:28:43 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-26 23:50:50 | 显示全部楼层
有一个笨办法,先取整,判断有几位(比6位少几位),比如说为n位,那么直接把它乘10^(6-n),再取整,再取每一位。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-27 01:03:58 | 显示全部楼层
我也没有什么好办法
这样行吗?
#include <stdio.h>

char *parse_data(char *dest, float data)
{
        char buf[1024];
        sprintf(buf, "%f", data);
        char *p = buf;
        for(size_t i = 0; i < 6; ++i)
        {
                if(*p == '.')
                        ++p;

                dest[i] = *p++;
        }
        dest[6] = '\0';
        return dest;
}

int main(void)
{
        char buf[1024];
        puts(parse_data(buf, 12.456f));
        puts(parse_data(buf, 12.6f));
        return 0;
}
124560
126000
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-27 01:30:23 | 显示全部楼层
      要把 12.456 转换成 {1,2,46,4,5,6} ,请问楼主,中间的 46 是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-27 01:44:47 From FishC Mobile | 显示全部楼层
本帖最后由 seglex 于 2019-9-27 01:47 编辑
jackz007 发表于 2019-9-27 01:30
要把 12.456 转换成 {1,2,46,4,5,6} ,请问楼主,中间的 46 是什么意思?


我觉得是最后一位冯5进1,舍去最后一位,再把小数点后的数以十进制整数输出,再单个输出原先小数点后面的数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-27 07:00:52 | 显示全部楼层
def floatToDict(source):
    target = str(source)
    
    integer, decimal = target.split('.', 1)
    len_int = len(integer)
    len_dec = len(decimal)
    temp = 'error'
    result = []
    
    if len_int > 6:
        return temp
    elif len_int + len_dec > 5:
        temp = integer[:] + '.' + decimal[0:5-len_int]
    else:
        temp = integer[:] + '.' + decimal[:] + '0' * (5-len_int-len_dec)

    for char in temp:
        if char.isdigit():
            result.append(int(char))
        else:
            result.append(ord(char))
        
    
    return result

source = 2.23
print(floatToDict(source))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-27 09:49:28 | 显示全部楼层
本帖最后由 xjtu_wong 于 2019-9-27 10:11 编辑
class Float_2_ASCII_dec():
    def __init__(self,float_in):
        self.float_in = float_in

    def invert_2_list(self):
        float_in_list = list(str(self.float_in))
        float_in_list_out = [0,0,0,0,0,0]
        for index in range(min(len(float_in_list),6)):
            float_in_list_out[index] = float_in_list[index]
        return float_in_list_out[0:6]

    def invert_2_ascii(self):
        float_in_list = Float_2_ASCII_dec.invert_2_list(self)
        print(float_in_list)
        float_in_str = str(float_in_list).replace('.','46')
        return float_in_str
if __name__ == "__main__":
    f2d_1 = Float_2_ASCII_dec(0.1)
    print(f2d_1.invert_2_ascii())
    f2d_2 = Float_2_ASCII_dec(0.12345678)
    print(f2d_2.invert_2_ascii())
>>>
['0', '.', '1', 0, 0, 0]
['0', '46', '1', 0, 0, 0]
['0', '.', '1', '2', '3', '4']
['0', '46', '1', '2', '3', '4']
最后转换成整数形式应该就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-27 09:50:05 | 显示全部楼层
seglex 发表于 2019-9-27 01:44
我觉得是最后一位冯5进1,舍去最后一位,再把小数点后的数以十进制整数输出,再单个输出原先小数点后面 ...

ASCII码里面的小数点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-27 10:49:23 | 显示全部楼层

这个输出结果是我要到的,请问怎么把它打印出来的字符一个一个放到unsigned char里面去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-27 12:53:12 | 显示全部楼层
Acrity 发表于 2019-9-27 10:49
这个输出结果是我要到的,请问怎么把它打印出来的字符一个一个放到unsigned char里面去

什么?

举个例子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-27 13:33:35 | 显示全部楼层

就是最后printf出来的1 2 46 4 5 6,怎么变成这样的形式unsigned char result[]={1,2,46,4,5,6};  我只会直接引用unsigned char result,我不太明白怎么放进去,麻烦帮我修改下!非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-27 14:22:43 | 显示全部楼层
Acrity 发表于 2019-9-27 13:33
就是最后printf出来的1 2 46 4 5 6,怎么变成这样的形式unsigned char result[]={1,2,46,4,5,6};  我只会 ...

这样?

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-27 15:14:18 | 显示全部楼层

完美解决,感谢大神的帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 11:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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