Python——任意正数任意进制转换(支持2~36进制和小数)

效果

1

代码

1.字母和数字转换

A ↔ 10 , B ↔ 11 , . . . , Z ↔ 35 A↔10,B↔11,...,Z↔35 A10B11...Z35

def trans(num):	# 输入数字换为字母或输入字母转换为数字
    if type(num) == int:
        if num < 10:
            return str(num)
        else:
            return chr(ord('A') + num - 10)
    else:
        if num.isdigit():
            return int(num)
        else:
            return ord(num) - ord('A') + 10

2.输入预处理

包含输入合法性检查,转换字符串,改大写,去除前导0

def check(num, base, target): # 待转换数字,当前进制,目标进制
    if type(base) is not int or base < 2 or base > 36 or type(target) is not int or target < 2 or target > 36:
        print('非法进制数!')
        return False
    if type(num) is int or type(num) is float:
        num = str(num).upper()
    elif type(num) is str and len(num) != 0:
        num = num.upper()
    else:
        print('非数字输入!')
        return False

    if num.count('.') > 1:
        print('多个小数点!')
        return False

    if not num.replace('.', '').isalnum():
        print('含有其他字符!')
        return False

    for c in num.replace('.', ''):
        if trans(c) >= base:
            print('字符超过进制允许!')
            return False

    while len(num) > 1:
        if num[0] == '0' and num[1] != '.':
            num = num[1:]
        else:
            break
    return num
3.进制转换

以十进制为中介,实现各进制之间转换。整数部分小数部分分别处理,尽可能地保证精度。

def basechange(num, base, target, precision=17): # 待转换数字,当前进制,目标进制,精度
    num = check(num, base, target)
    if num is False:
        return None
    point = num.find('.')
    if point == -1:
        point = len(num)
    radix = num.replace('.', '')
    if target == 10:
        int_part = radix[:point][::-1]
        frac_part = radix[point:]
        s = 0
        ss = 0
        for i in range(len(int_part)):
            s += trans(int_part[i]) * base ** i
        for i in range(len(frac_part)):
            ss += trans(frac_part[i]) / base ** (i+1)
        return str(s) + str(ss)[1:]
    elif base == 10:
        int_part = int(radix[:point])
        frac_part = float('0.'+radix[point:])
        s = ''
        while True:
            s += trans(int_part % target)
            int_part //= target
            if int_part == 0:
                break
        s = s[::-1]
        if frac_part != 0:
            s += '.'
            ct = 0
            while frac_part != 0 and ct < precision:
                frac_part *= target
                s += trans(int(frac_part))
                frac_part -= int(frac_part)
                ct += 1
        return s
    else:
        return basechange(basechange(num, base, 10, precision=precision), 10, target, precision=precision)
4.存在问题

由于浮点数在计算机中不能精确储存,所以对小数进行进制转换时,会有十分微小的误差。如图所示:2

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值