1. 程式人生 > >python十進位制和二進位制的轉換 (含浮點數)

python十進位制和二進位制的轉換 (含浮點數)

 Python中 浮點數之間的十進位制和二進位制的轉換 

#-*- coding: utf-8
from decimal import Decimal
def bTod(n, pre=4):
    '''
    把一個帶小數的二進位制數n轉換成十進位制
    小數點後面保留pre位小數
    '''
    string_number1 = str(n) #number1 表示二進位制數,number2表示十進位制數
    decimal = 0  #小數部分化成二進位制後的值
    flag = False   
    for i in string_number1: #判斷是否含小數部分
        if i == '.':
            flag = True
            break
    if flag: #若二進位制數含有小數部分
        string_integer, string_decimal = string_number1.split('.') #分離整數部分和小數部分
        for i in range(len(string_decimal)):
            decimal += 2**(-i-1)*int(string_decimal[i])  #小數部分化成二進位制
        number2 = int(str(int(string_integer, 2))) + decimal
        return round(number2, pre)
    else: #若二進位制數只有整數部分
        return int(string_number1, 2)#若只有整數部分 直接一行程式碼二進位制轉十進位制 python還是騷 

def dTob(n, pre=4):
    '''
    把十進位制的浮點數n轉換成二進位制
    小數點後面保留pre位小數
    '''
    string_number1 = str(n) #number1 表示十進位制數,number2表示二進位制數
    flag = False   
    for i in string_number1: #判斷是否含小數部分
        if i == '.':
            flag = True
            break
    if flag:
        string_integer, string_decimal = string_number1.split('.') #分離整數部分和小數部分
        integer = int(string_integer)
        decimal = Decimal(str(n)) - integer
        l1 = [0,1]
        l2 = []
        decimal_convert = ""
        while True:  
           if integer == 0: break
           x,y = divmod(integer, 2)  #x為商,y為餘數 
           l2.append(y)
           integer = x
        string_integer = ''.join([str(j) for j in l2[::-1]])  #整數部分轉換成二進位制 
        i = 0  
        while decimal != 0 and i < pre:  
            result = int(decimal * 2)  
            decimal = decimal * 2 - result  
            decimal_convert = decimal_convert + str(result)  
            i = i + 1  
        string_number2 = string_integer + '.' + decimal_convert
        return float(string_number2)

    
    else: #若十進位制只有整數部分
        l1 = [0,1]
        l2 = []
        while True:  
           if n == 0: break
           x,y = divmod(n, 2)  #x為商,y為餘數 
           l2.append(y)
           n = x
        string_number = ''.join([str(j) for j in l2[::-1]])  
        return int(string_number)