python - 有人可以帮我解释这段将小数转换为二进制的代码吗?

标签 python while-loop binary floating-point decimal

谁能帮我解释一下这段将小数转换为二进制的代码?

将十进制小数转换成二进制形式:

x = float(raw_input('Enter a decimal number between 0 and 1: '))

p = 0
while ((2**p)*x)%1 != 0:
    print('Remainder = ' + str((2**p)*x - int((2**p)*x)))
    p += 1

num = int(x*(2**p))

result = ''
if num == 0:
    result = '0'
while num > 0:
    result = str(num%2) + result
    num = num/2

for i in range(p - len(result)):
    result = '0' + result

result = result[0:-p] + '.' + result[-p:]
print('The binary representation of the decimal ' + str(x) + ' is ' + str(result))

最佳答案

我不认为这段代码写得很好,但这是一个粗略的想法。第一个 while 循环:

while ((2**p)*x)%1 != 0: ...

正在计算结果在小数点右边的二进制数。使用一个熟悉的类比,让我们以 10 为底数进行操作。如果数字是 1.234,并且我想转换为以 10 为底数(很简单),答案中小数点右边显然有 3 位。但是我怎么知道呢?好吧,我乘以 10、100、1000 等等,直到我得到一个没有小数部分的数字。 (...)%1 给出 (...) 的小数部分,当 ... 为整数时它为零.

既然我知道将输入值变成整数的最小 2 次方,我们就可以乘以它得到一个整数。该值在程序中称为 num。就像你在进行数学运算时使用小数一样,你可以忽略小数点并在计算完成后将其放入。从技术上讲,这是执行这些步骤

  • 乘以 10 的幂,
  • 研究数字
  • 完成后除以 10 的次方。

对于 2 的幂也是如此。数学上:

  conversion(x) == conversion(x*2**p)/2**p

从此处使用 num,我们计算输出中从最低有效位到最高有效位的位。这是开始的部分:

  while num > 0:

如果这个数是奇数,那么显然这个数转换成二进制后的最后一位也是奇数。否则最后一位将为 0。找出最低有效位后,我们将移动到下一个最高有效位,依此类推。

这是一个例子。假设数字是 5。这很奇数,所以我们现在知道二进制的最后一位将是 1。现在考虑剩余的部分 4(因为 4 = 5-1)将它移到右边的一个位置,以便能够考虑它的最小值-重要的一点。不要担心右移一位,因为在答案中我们将在将其插入最终结果之前将其左移一位。

4 移动一位是 2。即使是 '0'。在我们之前的“1”的左边,我们现在放置那个“0”。 2 仍然存在 (2 = 2 - 0),因此我们再次将 2 向右移动一位,考虑剩余的部分,现在是 1。这很奇怪,因此在 '01' 的左侧添加另一个 '1'。现在 ins 剩下的是 0 (1-1=0) 所以我们停止。总而言之,我们得到了“101”。

之前我们已经计算了小数点右边有多少位,p。所以开始的部分:

 for i in range(p - len(result)):
    result = '0' + result

是在超过 p 的数字的开头添加 0。然后在小数点后添加最右边的 p 个字符:

  result = result[0:-p] + '.' + result[-p:]

关于python - 有人可以帮我解释这段将小数转换为二进制的代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30848436/

相关文章:

python - 比较 2 个整数列表

python - 检查 Python 包是否需要 Visual Studio 构建工具

while-loop - 在 Julia 中使用逻辑运算符控制流程

java - 当 ResultSet 没有执行时?

python - 我有一个具有偏移参数并想要循环的函数

Haskell Stack 构建特定的可执行文件

python - 如何将 python 日期时间转换为具有可读格式日期的字符串?

python - 自定义 flask 应用程序在本地主机上运行良好,但向外部访问者返回 500 响应

c - 二叉树节点以及与父节点的关系

c++ - 如何在 1 字节字符中存储 2 个数字?