鱼C论坛

 找回密码
 立即注册
查看: 1933|回复: 8

[已解决]10进制转换2进制的函数问题

[复制链接]
发表于 2021-8-23 20:00:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def Dec2Bin(dec):
    temp = []
    result = ''
   
    while dec:
        quo = dec % 2
        dec = dec // 2
        temp.append(quo)

    while temp:
        result += str(temp.pop())
   
    return result

print(Dec2Bin(62))

这是10进制转换2进制的题目答案,但是,这个程序没法判断有小数的10进制,例如62.123就没法转换了
请问这个程序如何改才能让带有小数的数字也能转换呢?
最佳答案
2021-8-24 08:57:24
本帖最后由 叼辣条闯世界 于 2021-8-24 09:02 编辑
  1. #-*- coding: utf-8
  2. from decimal import Decimal
  3. def bTod(n, pre=4):
  4.     '''
  5.     把一个带小数的二进制数n转换成十进制
  6.     小数点后面保留pre位小数
  7.     '''
  8.     string_number1 = str(n) #number1 表示二进制数,number2表示十进制数
  9.     decimal = 0  #小数部分化成二进制后的值
  10.     flag = False
  11.     for i in string_number1: #判断是否含小数部分
  12.         if i == '.':
  13.             flag = True
  14.             break
  15.     if flag: #若二进制数含有小数部分
  16.         string_integer, string_decimal = string_number1.split('.') #分离整数部分和小数部分
  17.         for i in range(len(string_decimal)):
  18.             decimal += 2**(-i-1)*int(string_decimal[i])  #小数部分化成二进制
  19.         number2 = int(str(int(string_integer, 2))) + decimal
  20.         return round(number2, pre)
  21.     else: #若二进制数只有整数部分
  22.         return int(string_number1, 2)#若只有整数部分 直接一行代码二进制转十进制 python还是骚

  23. def dTob(n, pre=4):
  24.     '''
  25.     把一个带小数的十进制数n转换成二进制
  26.     小数点后面保留pre位小数
  27.     '''
  28.     string_number1 = str(n) #number1 表示十进制数,number2表示二进制数
  29.     flag = False
  30.     for i in string_number1: #判断是否含小数部分
  31.         if i == '.':
  32.             flag = True
  33.             break
  34.     if flag:
  35.         string_integer, string_decimal = string_number1.split('.') #分离整数部分和小数部分
  36.         integer = int(string_integer)
  37.         decimal = Decimal(str(n)) - integer
  38.         l1 = [0,1]
  39.         l2 = []
  40.         decimal_convert = ""
  41.         while True:
  42.            if integer == 0: break
  43.            x,y = divmod(integer, 2)  #x为商,y为余数
  44.            l2.append(y)
  45.            integer = x
  46.         string_integer = ''.join([str(j) for j in l2[::-1]])  #整数部分转换成二进制
  47.         i = 0
  48.         while decimal != 0 and i < pre:
  49.             result = int(decimal * 2)
  50.             decimal = decimal * 2 - result
  51.             decimal_convert = decimal_convert + str(result)
  52.             i = i + 1
  53.         string_number2 = string_integer + '.' + decimal_convert
  54.         return float(string_number2)
  55.     else: #若十进制只有整数部分
  56.         l1 = [0,1]
  57.         l2 = []
  58.         while True:
  59.            if n == 0: break
  60.            x,y = divmod(n, 2)  #x为商,y为余数
  61.            l2.append(y)
  62.            n = x
  63.         string_number = ''.join([str(j) for j in l2[::-1]])
  64.         return int(string_number)
复制代码

举个例子:
>>>dTob(5.31,5)#将5.31转成二进制,保留5位小数
101.01001
>>>bTod(101.01001,5)#将101.01001转成十进制,保留5位小数
5.28125



浮点数运算可能有一点误差
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-23 20:57:53 | 显示全部楼层
我说一下思路哈,先根据小数点把整数部分和小数部分分开
然后每一段分别转换为二进制(因为小数转换方式和整数不一样),小数的不会的话你可以自己去查一下
最后拼接起来
你先这样试一下,欢迎追问
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-23 22:34:23 | 显示全部楼层
十进制小数转二进制可能位数无限的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-24 00:27:55 | 显示全部楼层
塔利班 发表于 2021-8-23 22:34
十进制小数转二进制可能位数无限的

设置个位数上限不就行了嘛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-24 08:57:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 叼辣条闯世界 于 2021-8-24 09:02 编辑
  1. #-*- coding: utf-8
  2. from decimal import Decimal
  3. def bTod(n, pre=4):
  4.     '''
  5.     把一个带小数的二进制数n转换成十进制
  6.     小数点后面保留pre位小数
  7.     '''
  8.     string_number1 = str(n) #number1 表示二进制数,number2表示十进制数
  9.     decimal = 0  #小数部分化成二进制后的值
  10.     flag = False
  11.     for i in string_number1: #判断是否含小数部分
  12.         if i == '.':
  13.             flag = True
  14.             break
  15.     if flag: #若二进制数含有小数部分
  16.         string_integer, string_decimal = string_number1.split('.') #分离整数部分和小数部分
  17.         for i in range(len(string_decimal)):
  18.             decimal += 2**(-i-1)*int(string_decimal[i])  #小数部分化成二进制
  19.         number2 = int(str(int(string_integer, 2))) + decimal
  20.         return round(number2, pre)
  21.     else: #若二进制数只有整数部分
  22.         return int(string_number1, 2)#若只有整数部分 直接一行代码二进制转十进制 python还是骚

  23. def dTob(n, pre=4):
  24.     '''
  25.     把一个带小数的十进制数n转换成二进制
  26.     小数点后面保留pre位小数
  27.     '''
  28.     string_number1 = str(n) #number1 表示十进制数,number2表示二进制数
  29.     flag = False
  30.     for i in string_number1: #判断是否含小数部分
  31.         if i == '.':
  32.             flag = True
  33.             break
  34.     if flag:
  35.         string_integer, string_decimal = string_number1.split('.') #分离整数部分和小数部分
  36.         integer = int(string_integer)
  37.         decimal = Decimal(str(n)) - integer
  38.         l1 = [0,1]
  39.         l2 = []
  40.         decimal_convert = ""
  41.         while True:
  42.            if integer == 0: break
  43.            x,y = divmod(integer, 2)  #x为商,y为余数
  44.            l2.append(y)
  45.            integer = x
  46.         string_integer = ''.join([str(j) for j in l2[::-1]])  #整数部分转换成二进制
  47.         i = 0
  48.         while decimal != 0 and i < pre:
  49.             result = int(decimal * 2)
  50.             decimal = decimal * 2 - result
  51.             decimal_convert = decimal_convert + str(result)
  52.             i = i + 1
  53.         string_number2 = string_integer + '.' + decimal_convert
  54.         return float(string_number2)
  55.     else: #若十进制只有整数部分
  56.         l1 = [0,1]
  57.         l2 = []
  58.         while True:
  59.            if n == 0: break
  60.            x,y = divmod(n, 2)  #x为商,y为余数
  61.            l2.append(y)
  62.            n = x
  63.         string_number = ''.join([str(j) for j in l2[::-1]])
  64.         return int(string_number)
复制代码

举个例子:
>>>dTob(5.31,5)#将5.31转成二进制,保留5位小数
101.01001
>>>bTod(101.01001,5)#将101.01001转成十进制,保留5位小数
5.28125



浮点数运算可能有一点误差
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-26 18:13:45 | 显示全部楼层
叼辣条闯世界 发表于 2021-8-24 08:57
举个例子:
>>>dTob(5.31,5)#将5.31转成二进制,保留5位小数
101.01001

  else: #若二进制数只有整数部分
        return int(string_number1, 2)#若只有整数部分 直接一行代码二进制转十进制 python还是骚
这行代码中的int就可以把二进制化为10进制吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-27 20:14:29 | 显示全部楼层
Jerry~Mouse 发表于 2021-8-26 18:13
else: #若二进制数只有整数部分
        return int(string_number1, 2)#若只有整数部分 直接一行代码 ...

是的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-27 20:15:40 | 显示全部楼层
Jerry~Mouse 发表于 2021-8-26 18:13
else: #若二进制数只有整数部分
        return int(string_number1, 2)#若只有整数部分 直接一行代码 ...

https://blog.csdn.net/weixin_39734048/article/details/110169769你可以看看这片文章
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-8-27 21:13:01 | 显示全部楼层
叼辣条闯世界 发表于 2021-8-27 20:15
https://blog.csdn.net/weixin_39734048/article/details/110169769你可以看看这片文章

好的好的 谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-19 09:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表