如何提取浮点数的每一位
本帖最后由 Acrity 于 2019-9-26 17:30 编辑小弟现在提取到一个float的数据, 要把每一位提出来,放在一个数组里发出去,格式都要六位的浮点数,如12.2341.3456。比如接受到的1.23就不满6位要末尾补零变成1.2300,后面如果多也不要。最终希望能把12.456转换成{1,2,46,4,5,6}这样的形式(ASCII码的十进制形式),小弟对这些实在是一知半解很头疼,所以求大神帮助! 好吧,改一改
#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
请按任意键继续. . . 嘛。有点着急的,老板一直在催,求大神速码,能用立马悬赏!小弟在此谢过! 你把浮点数转化成字符串型,然后判断是不是6位,多了就去掉最后几位,少了就补零,然后将字符串作为迭代对象逐个输出到列表就完了,如果遇到小数点,就变成数字46 学习 有一个笨办法,先取整,判断有几位(比6位少几位),比如说为n位,那么直接把它乘10^(6-n),再取整,再取每一位。 我也没有什么好办法
这样行吗?
#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
请按任意键继续. . .
要把 12.456 转换成 {1,2,46,4,5,6} ,请问楼主,中间的 46 是什么意思? 本帖最后由 seglex 于 2019-9-27 01:47 编辑
jackz007 发表于 2019-9-27 01:30
要把 12.456 转换成 {1,2,46,4,5,6} ,请问楼主,中间的 46 是什么意思?
我觉得是最后一位冯5进1,舍去最后一位,再把小数点后的数以十进制整数输出,再单个输出原先小数点后面的数 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 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']
最后转换成整数形式应该就可以了
seglex 发表于 2019-9-27 01:44
我觉得是最后一位冯5进1,舍去最后一位,再把小数点后的数以十进制整数输出,再单个输出原先小数点后面 ...
ASCII码里面的小数点 人造人 发表于 2019-9-27 01:47
好吧,改一改
这个输出结果是我要到的,请问怎么把它打印出来的字符一个一个放到unsigned char里面去 Acrity 发表于 2019-9-27 10:49
这个输出结果是我要到的,请问怎么把它打印出来的字符一个一个放到unsigned char里面去
什么?
举个例子 人造人 发表于 2019-9-27 12:53
什么?
举个例子
就是最后printf出来的1 2 46 4 5 6,怎么变成这样的形式unsigned char result[]={1,2,46,4,5,6};我只会直接引用unsigned char result,我不太明白怎么放进去,麻烦帮我修改下!非常感谢! Acrity 发表于 2019-9-27 13:33
就是最后printf出来的1 2 46 4 5 6,怎么变成这样的形式unsigned char result[]={1,2,46,4,5,6};我只会 ...
这样?
人造人 发表于 2019-9-27 14:22
这样?
完美解决,感谢大神的帮助
页:
[1]