Jic*_*hao -1 python floating-point
在碱2中,1/10是无限重复的部分
0.0001100110011001100110011001100110011001100110011 ...
如何让python解释器打印这种内心表示?repr(0.1)没有帮助.
您可以使用struct模块获取float的内部表示.获得表示后,您只需将字符转换为序数值并将其格式化为二进制.
>>> import struct
>>> def float_rep(num):
return ''.join("{:08b}".format(ord(elem)) for elem in struct.pack('!f', num))
>>> float_rep(0.1)
'00111101110011001100110011001101'
Run Code Online (Sandbox Code Playgroud)
编辑
虽然上面会为你提供内部的实际表示,但我想,你对二进制的二进制当量更感兴趣.以下内容足以满足您的查询需求
>>> def float_to_bin(num):
sign = '-' if num < 0 else ''
num = abs(num)
whole = int(num)
num -= whole
yield sign + bin(whole) + '.'
while num:
num*= 2
whole = int(num)
yield str(whole)
num -= whole
>>> ''.join(islice(float_to_bin(1.1),None,20))
'1.0001100110011001100'
>>> ''.join(islice(float_to_bin(-1.1),None,20))
'-1.0001100110011001100'
>>> ''.join(islice(float_to_bin(.1),None,20))
'0.0001100110011001100'
>>> ''.join(islice(float_to_bin(0),None,20))
'0.'
>>> ''.join(islice(float_to_bin(1),None,20))
'1.'
>>> ''.join(islice(float_to_bin(0.25),None,20))
'0.01'
>>> ''.join(islice(float_to_bin(0.5),None,20))
'0.1'
>>> ''.join(islice(float_to_bin(-0.5),None,20))
'-0.1'
Run Code Online (Sandbox Code Playgroud)