Python十进制转二进制,二进制转十进制。浮点数float精度问题

Python处理浮点数精度存在的问题
以及Python十进制二进制相互之间的转换

def zbinary(num):

    #判断是否为整数

    if num == int(num):

        integer = '{:b}'.format(int(num)) #将十进制整数转换为二进制数

        return num

    else:

        integer_part = int(num) #取十进制浮点数的整数部分

        decimal_part = num - integer_part #取十进制浮点数的小数部分

        integer_partcom = '{:b}'.format(integer_part) #利用format将十进制数整数转换为二进制数

        #小数部分转化为二进制

        f = decimal_part

        fbb = [] #存小数部分二进制数

        A = True #用于循环

        while A:

            f = f * 2 #小数变二进制数是乘以2,整数是辗转相除法

            fbb += str(int(f))  #逢1进1,0不进。!!!这里有一个问题+=与 =  +有问题

            if f > 1:

                f = f - int(f)  #减1取小数部分继续

            elif f < 1:

                pass

            else:

                break

        flocom = fbb

        return integer_partcom + '.' + ''.join(flocom) #将二进制的字符串拼接在一起

def zdecimal(n):

      #将二进制小数转换为十进制浮点数

      # number1 表示二进制数,number2表示十进制数

    string_number1=str(n)

    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, 4)

    else:  # 若二进制数只有整数部分

        return int(string_number1, 2)  # 若只有整数部分

if __name__ == '__main__':

    a = 0.55

    b = 0.3

    result1 = zbinary(a)

    result2 = zbinary(b)

    result = result1 + result2

    print(result1)

    print(result2)

    #print(result1+result2)

    to1 = zdecimal(result1)

    to2 = zdecimal(result2)

    print(to1)

    print(to2)

    print(to1+to2)

    #print(float(result1,base=10))

测试结果
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值