对于任一的十进制数据,可先将其分成整数部分和小数部分。整数部分利用Python自带的bin()函数、oct()函数和hex()函数可直接转换(详见Python-编码规则);小数部分可利用该编程方法(详见Python-十进制的小数部分转换为其他进制数)进行转换。最后分别将转换之后的整数部分和小数部分写在一起即可。
这里在前面编程方法的基础上(详见Python-十进制的小数部分转换为其他进制数),对以上过程用一个程序来实现。
#代码如下:
import math
from decimal import Decimal
datum = input('请输入要转换的十进制数:')
# 通过input函数得到的变量为字符串类型,即datum为字符串类型的变量
ly = 16
# 可调整的地方1:这里设置要转换为几进制
# 先开始整数部分的转换
AA = int(float(datum))
# int()函数不能将字符串类型的数据转换为整数,所以得先用float()函数将其转换为浮点型数据(注意float函数只能转换数字类的字符串,而不能转换文字类的字符串)
# int()函数对浮点型数据进行转换时,是向下取整(即直接取整数部分)
if ly == 2:
BB=bin(AA)
if ly == 8:
BB=oct(AA)
if ly == 16:
BB=hex(AA)
# 再开始小数部分的转换
aa = Decimal(str(datum)) - Decimal(str(AA))
# Decimal输入的参数要求是字符串类型,如Decimal('1.1')+Decimal('2.2'),所以这里应该利用str()函数将数据转换为字符串类型
if aa > 0:
# 设置这个条件语句的目的是防止输入的刚好是一个整数,这样的话就不用对小数部分进行转换了
n = 10
# 可调整的地方2:设定保留的二进制小数的位数(之所以要设定是因为有些十进制的小数如0.7,化为二进制的小数时,会出现无限循环的情况)
m = range(n)
cc = []
for i in m:
bb = aa * ly
dd = math.floor(bb)
# math.floor()函数向下取整(即直接取整数部分);math.ceil()函数向上取整数(即取整数部分加1);这两者均不进行四舍五入的运算
cc.append(dd)
aa = Decimal(str(bb)) - Decimal(str(dd))
# Decimal输入的参数要求是字符串类型,如Decimal('1.1')+Decimal('2.2'),所以这里应该利用str()函数将数据转换为字符串类型
if ly > 10:
if cc[i] == 10:
cc[i] = 'A'
if cc[i] == 11:
cc[i] = 'B'
if cc[i] == 12:
cc[i] = 'C'
if cc[i] == 13:
cc[i] = 'D'
if cc[i] == 14:
cc[i] = 'E'
if cc[i] == 15:
cc[i] = 'F'
# 以上的条件语句是当将数据转换为十六进制的时候,应该用字母来代替10以上的数字而添加的
ee = [str(i) for i in cc]
ff = ''.join(ee)
# 以上两行是将列表中的元素连起来形成一个字符串后再进行输出
# 将整数部分和小数部分汇总
print('转换得到的' + str(ly) + '进制数为:' + str(BB) + '.' + ff)
else:
print('转换得到的' + str(ly) + '进制数为:' + str(BB))
当然,可以将小数部分转换的程序写成一个函数或是一个模块,这样在以后的使用中就可以直接引用或者导入,这里就不赘述了。
以上程序是正数的转换,如果需要转换负数,那就先转换该数的正数形式,再在转换结果前加上负号即可。