Acrity 发表于 2019-9-26 14:59:54

如何提取浮点数的每一位

本帖最后由 Acrity 于 2019-9-26 17:30 编辑

小弟现在提取到一个float的数据, 要把每一位提出来,放在一个数组里发出去,格式都要六位的浮点数,如12.2341.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;
        sprintf(buf, "%f", data);
        char *p = buf;
        for(size_t i = 0; i < 6; ++i)
        {
                dest = *p++;
                if(dest != '.')
                        dest -= '0';
        }
        dest = '\0';
        return dest;
}

int main(void)
{
        unsigned char buf;
        parse_data(buf, 12.456f);
        for(size_t i = 0; i < 6; ++i)
                printf("%d ", buf);
        printf("\n");
       
        parse_data(buf, 12.6f);
        for(size_t i = 0; i < 6; ++i)
                printf("%d ", buf);
        printf("\n");
        return 0;
}


1 2 46 4 5 6
1 2 46 6 0 0
请按任意键继续. . .

Acrity 发表于 2019-9-26 15:25:47

嘛。有点着急的,老板一直在催,求大神速码,能用立马悬赏!小弟在此谢过!

雨冷青杉 发表于 2019-9-26 19:42:37

你把浮点数转化成字符串型,然后判断是不是6位,多了就去掉最后几位,少了就补零,然后将字符串作为迭代对象逐个输出到列表就完了,如果遇到小数点,就变成数字46

美丽小企鹅-邯郸 发表于 2019-9-26 20:28:43

学习

自然 发表于 2019-9-26 23:50:50

有一个笨办法,先取整,判断有几位(比6位少几位),比如说为n位,那么直接把它乘10^(6-n),再取整,再取每一位。

人造人 发表于 2019-9-27 01:03:58

我也没有什么好办法
这样行吗?

#include <stdio.h>

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

                dest = *p++;
        }
        dest = '\0';
        return dest;
}

int main(void)
{
        char buf;
        puts(parse_data(buf, 12.456f));
        puts(parse_data(buf, 12.6f));
        return 0;
}


124560
126000
请按任意键继续. . .

jackz007 发表于 2019-9-27 01:30:23

      要把 12.456 转换成 {1,2,46,4,5,6} ,请问楼主,中间的 46 是什么意思?

seglex 发表于 2019-9-27 01:44:47

本帖最后由 seglex 于 2019-9-27 01:47 编辑

jackz007 发表于 2019-9-27 01:30
要把 12.456 转换成 {1,2,46,4,5,6} ,请问楼主,中间的 46 是什么意思?

我觉得是最后一位冯5进1,舍去最后一位,再把小数点后的数以十进制整数输出,再单个输出原先小数点后面的数

XiaoPaiShen 发表于 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
    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))

xjtu_wong 发表于 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 =
      for index in range(min(len(float_in_list),6)):
            float_in_list_out = float_in_list
      return float_in_list_out

    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']
最后转换成整数形式应该就可以了

xjtu_wong 发表于 2019-9-27 09:50:05

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

ASCII码里面的小数点

Acrity 发表于 2019-9-27 10:49:23

人造人 发表于 2019-9-27 01:47
好吧,改一改

这个输出结果是我要到的,请问怎么把它打印出来的字符一个一个放到unsigned char里面去

人造人 发表于 2019-9-27 12:53:12

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

什么?

举个例子

Acrity 发表于 2019-9-27 13:33:35

人造人 发表于 2019-9-27 12:53
什么?

举个例子

就是最后printf出来的1 2 46 4 5 6,怎么变成这样的形式unsigned char result[]={1,2,46,4,5,6};我只会直接引用unsigned char result,我不太明白怎么放进去,麻烦帮我修改下!非常感谢!

人造人 发表于 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};我只会 ...

这样?

Acrity 发表于 2019-9-27 15:14:18

人造人 发表于 2019-9-27 14:22
这样?

完美解决,感谢大神的帮助
页: [1]
查看完整版本: 如何提取浮点数的每一位