将浮点数转换成二进制

3

我需要将一个浮点数值转换成二进制。这个值的范围是从0到99.99。

我发现如果值是一个整数,并且在0到255之间,我只需要做:

n = [255]
num = byte(n)

将浮点数直接转换为二进制是不可能的(我认为),我的第一步是将浮点数乘以100,从而获得一个从0到9999的整数。

现在我需要4个字节来表示这个数字。

下面这段Arduino代码可以完成此操作吗?

n = 9999
byte = pl[4];

pl[0] = (byte) ((n & 0xFF000000) >> 24 );
pl[1] = (byte) ((n & 0x00FF0000) >> 16 );
pl[2] = (byte) ((n & 0x0000FF00) >> 8 );
pl[3] = (byte) ((n & 0X000000FF));

基本上我正在应用一个掩码,但我不知道如何用Python做到这一点,因为我是个新手。:/

更多信息:

目标是缩短我的结果长度以通过无线协议发送。这就是为什么我要将它转换成byte的原因。

非常感谢。


你能再澄清一些吗?例如,如果数字是12.34。你期望的输出是什么?是 1100.100010 还是在乘以100之后,你想要 010011010010 - theashwanisingla
我需要 int 值,1234 - Lleims
我仍然认为了解您的确切上下文可能有助于为您提供最佳建议。将它们转换为4个字节而不是只使用两个字节,这有何原因?对于您的数字来说,使用两个字节就足够了。这是否需要内存效率/与现有某些内容兼容?另外,您将如何处理这些字节? 将它们写入磁盘? 通过UDP、自定义TCP协议、HTTP将它们发送到网络? - gelonida
对不起,我只需要2个字节,我搞错了。我需要发送这些信息,并且需要缩短它的长度,因为我正在使用IoT协议。 - Lleims
4个回答

2
def f2b(a):
import math
binary = []
for i in range(100):
    a=a*2
    if a<1:
        binary.append(0)
    else:
        binary.append(1)
    if a==0:
        break
    a,b=math.modf(a)
binary=''.join(str(d) for d in binary)
return binary[:-1]

这不是一种完美的方法,但它可以完美地工作。输入任何可被2整除的浮点值(例如0.25),输出将是一个二进制值,比如说“10”。

谢谢。


2
请记住,Stack Overflow 不仅旨在解决当前的问题,还要帮助未来的读者找到类似问题的解决方案,这需要理解底层代码。对于我们社区中的初学者和不熟悉语法的成员来说,这尤其重要。鉴于此,您能否编辑您的答案,包括您正在做什么以及为什么您认为这是最好的方法的解释 - Jeremy Caney

2

一个等效的方式是

x=2049
p0 = (x>>24)&255
p1 = (x>>16)&255
p2 = (x>>8)&255
p3 = x&255

1
是的,你可以在Python中完全做同样的事情。
这将是你代码的字面翻译。
n = int(floatnumber * 100 + 0.5)
bytes_to_write = bytes([(n>>24)&255, (n>>16)&255, (n>>8) & 255, n & 255])

但是你也可以使用 struct 模块(https://docs.python.org/3.6/library/struct.html)和(https://docs.python.org/3.6/library/struct.html#format-characters)来处理格式字符:

import struct
n = int(floatnumber * 100 + 0.5)
bytes_to_write = struct.pack(">l", n)

将整数存储为大端字节序列

要仅创建两个字节,请使用

n = int(floatnumber * 100 + 0.5)
bytes_to_write = bytes([(n>>8) & 255, n & 255])

或者

import struct
n = int(floatnumber * 100 + 0.5)
bytes_to_write = struct.pack(">H", n)

添加了一个两字节的解决方案。 - gelonida
请注意,n = int(floatnumber * 100 + 0.5) 确保任何浮点数正确地四舍五入到小数点后两位最接近的浮点数。如果您的上下文中已经将数字舍入为两位小数,则可以从上面的代码中删除 + 0.5。但是,如果您保留它,它不会造成任何伤害,如果您输入未舍入的数字,它将被四舍五入。 - gelonida

1
根据您的评论,您需要这个:
number = float(input("Enter any number:"))
decimal = int(str(number).split(".")[0])
print(decimal)
mantissa= int(str(number).split(".")[1])
print(mantissa)
if mantissa != 0:
    pass
else:
    mantissa = 0
int_num = decimal*(10**(len(str(mantissa))))+mantissa

您将获得该数字的整数值,不带小数点。现在您可以直接将其转换为二进制。


该数字将被转换为整数,您可以创建一个二进制数,但在此过程中,您将失去小数点的位置,除非您为其牺牲另一个字节。 - gelonida
是的。但这是根据与@NEA在评论中的讨论得出的解决方案,因为他只想要这个结果。 - theashwanisingla
我的意思是,这个解决方案自动猜测尾数长度,而不是假设为2(增加了复杂性)。在我看来,这并不是优势,在某些边界情况下甚至不可取。它使得无法可预测地转换和还原数据,例如12.34、123.4都会被转换为1234,而反向操作则不知道该在哪里放置小数点。如果您只输入有效数据,则不会有任何区别,但在可能的情况下,我建议进行防御性编程,在给定的情况下,防御性实现甚至会更简单。 - gelonida
是的,你说得对。我们需要为小数点的位置添加额外的名称。 - theashwanisingla
如果发送方和接收方事先同意小数点后的数字位数(例如2),则无需额外的字节,但是发送方和接收方都应该在代码中硬编码。 - gelonida
是的,没错。但是在存在歧义的情况下,发送位置信息是必要的。否则,这段代码足以将任何十进制数据转换为去除小数点的形式。感谢您进行公正的交流。 - theashwanisingla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接