这是我的python代码,将十进制数转换为二进制数,它适用于一些简单的数字,如0.876,但当我给它一些硬数字,如0.876,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,1,0,1,但是真正的二进制应该是0.11100000010000011001。我就是想不通为什么,有人能帮帮我吗?
bina = []
ori = 0.5
nextn = 0
def ftob(x):
global ori
global nextn
if x == 0:
return bina
else:
a = x/ori
if a >= 1:
bina.append(1)
nextn = x - ori
ori = ori/2
else:
bina.append(0)
ori = ori/2
return ftob(nextn)
print(ftob(0.876))
发布于 2021-09-13 02:32:39
请注意,这是二进制浮点的本质:这不是
中的错误,也不是代码中的错误。您将在支持硬件浮点运算的所有语言中看到相同类型的内容(尽管某些语言可能不会在缺省情况下或在所有输出模式中显示差异)。
浮点数在计算机硬件中表示为基数2(二进制)小数。例如,小数小数
0.125
值为1/10 + 2/100 + 5/1000
,以同样的方式,二进制分数
0.001
值为0/2 + 0/4 + 1/8
。这两个分数具有相同的值,唯一真正的区别是第一个是用基数10的小数记数法编写的,而第二个是用基数2的小数表示法编写的。
不幸的是,大多数小数不能精确地表示为二进制小数。其结果是,通常情况下,您输入的十进制浮点数仅由机器中实际存储的二进制浮点数近似。
有趣的是,有许多不同的十进制数共享相同的最接近的二进制小数。例如,数字0.1
、0.10000000000000001
和0.1000000000000000055511151231257827021181583404541015625
都由3602879701896397 / 2 ** 55
近似。由于所有这些十进制值共享相同的近似值,因此它们中的任何一个都可以显示,同时仍然保留不变的eval(repr(x)) == x
。
过去,Python prompt和内置的repr()
函数会选择17位有效数字0.10000000000000001。从Python3.1开始,Python (在大多数系统上)现在可以选择其中最短的一个,并简单地显示0.1。
https://stackoverflow.com/questions/69157248
复制