最开始写的时候心里没有固定的模板,隐约懂得要怎么写,顺着心意写下去,边写边改,写的时候也有一点点的强迫症,尽量把能统一的全部统一,为了可读性和容易理解性(也是为了好写,要不然觉得写起来太麻烦,虽然最后发现好像写的有点奇葩,有点走形,但是自我认同感还是比较高的,自觉身为小白应该差不多了),把中间的过程全部拆开了,不足之处、有待改进之处肯定有,建议和意见尽管提,望指正
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位,没有继续改,如果有大佬的想法比较好,可以写在评论区(我暂时有点懒得想方法改了),望海涵
以上。。