十进制与二进制的相互转换

最开始写的时候心里没有固定的模板,隐约懂得要怎么写,顺着心意写下去,边写边改,写的时候也有一点点的强迫症,尽量把能统一的全部统一,为了可读性和容易理解性(也是为了好写,要不然觉得写起来太麻烦,虽然最后发现好像写的有点奇葩,有点走形,但是自我认同感还是比较高的,自觉身为小白应该差不多了),把中间的过程全部拆开了,不足之处、有待改进之处肯定有,建议和意见尽管提,望指正

 1 def inverse(a):       #将数字逆序
 2     m=''
 3     for i in a[::-1]:
 4        m=m+i
 5     return str(int(m))
 6 def judge(a):         #判断二进制数
 7     for i in a[:]:
 8         if i not in ["0","1","."]:
 9             return False
10     return True
11 def bTod1(a=0):        #二转十整数
12     m=0
13     for i in range (0,len(a)):
14         m=m+int(a[len(a)-1-i])*2**i
15     return m
16 def bTod2(a=0):        #二转十小数
17     m=0
18     for i in range (0,len(a)):
19         m=m+int(a[i])*2**(-i-1)
20     return m
21 def dTob1(a=0):       #十转二整数
22     m=''
23     a=int(a)
24     for i in range (0,100):
25         b=a%2
26         a=a//2
27         m=m+str(b)
28     m=inverse(m)
29     return m
30 def dTob2(a=0):       #十转二小数
31     m=''
32     a=int(a)*10**(-len(a))
33     for i in range (0,100):
34         a=a*2
35         b=int(a//1)
36         a=a%1
37         m=m+str(b)
38     return inverse(str(int(inverse(m))))
39 def bTod(b):       #二进制转换为十进制
40     if judge(b)==False:
41         return "输入错误,请重新输入"
42     elif "." not in b:
43         return bTod1(b)
44     else:
45          a=b.split('.',1)
46          return(bTod1(a[0])+bTod2(a[1]))
47 def dTob(d):        #十进制转换为二进制
48     if "." not in d:
49         return dTob1(d)
50     else:
51         a=d.split('.',1)
52         return (dTob1(a[0])+"."+dTob2(a[1]))
53 b=input("请输入一个二进制数字,将转换为十进制数字")
54 d=input("请输入一个十进制数字,将转换为二进制数字")
55 print(bTod(b))
56 print(dTob(d))

对于精度的问题我并没有去主动保留几位(但是保留肯定可以,方法应该不是很麻烦),二进制转十进制的精度问题不大,不会是无限小数,就没管,有几位就输出几位,十进制转二进制的时候有可能会出现无限小数,因此设定上限为100位,将保留100位以内的所有有效值(100位以内的最后一位有效值之后的所有的0将不被保留),十进制转换为二进制的整数部分的位数上限也界定为了100位,没有继续改,如果有大佬的想法比较好,可以写在评论区(我暂时有点懒得想方法改了),望海涵

以上。。

猜你喜欢

转载自www.cnblogs.com/wobenqiuxin/p/9172546.html