現在是凌晨1點56 今天6月7號 高考
我終於寫完了 , 十進制轉二進制的小數部分卡了我將近一個小時
上代碼
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 24 def dTob(n, pre=4): 25 ''' 26 把一個帶小數的十進制數n轉換成二進制 27 小數點后面保留pre位小數 28 ''' 29 string_number1 = str(n) #number1 表示十進制數,number2表示二進制數 30 flag = False 31 for i in string_number1: #判斷是否含小數部分 32 if i == '.': 33 flag = True 34 break 35 if flag: 36 string_integer, string_decimal = string_number1.split('.') #分離整數部分和小數部分 37 integer = int(string_integer) 38 decimal = Decimal(str(n)) - integer 39 l1 = [0,1] 40 l2 = [] 41 decimal_convert = "" 42 while True: 43 if integer == 0: break 44 x,y = divmod(integer, 2) #x為商,y為余數 45 l2.append(y) 46 integer = x 47 string_integer = ''.join([str(j) for j in l2[::-1]]) #整數部分轉換成二進制 48 i = 0 49 while decimal != 0 and i < pre: 50 result = int(decimal * 2) 51 decimal = decimal * 2 - result 52 decimal_convert = decimal_convert + str(result) 53 i = i + 1 54 string_number2 = string_integer + '.' + decimal_convert 55 return float(string_number2) 56 else: #若十進制只有整數部分 57 l1 = [0,1] 58 l2 = [] 59 while True: 60 if n == 0: break 61 x,y = divmod(n, 2) #x為商,y為余數 62 l2.append(y) 63 n = x 64 string_number = ''.join([str(j) for j in l2[::-1]]) 65 return int(string_number)
晚安
