数据结构进制转换含小数
时间: 2023-09-03 19:11:58 浏览: 44
进制转换是将一个数从一种进制表示转换为另一种进制表示。下面是一个示例程序,可以将一个十进制数转换为其他进制(2-16进制),或者将其他进制的数转换为十进制。同时,该程序也支持含小数的转换。
```python
def dec_to_base(n, base):
"""将十进制数n转换为base进制"""
result = ""
while n > 0:
digit = n % base
if digit < 10:
result = str(digit) + result
else:
result = chr(digit - 10 + ord('A')) + result
n //= base
return result
def base_to_dec(s, base):
"""将base进制数s转换为十进制"""
result = 0
for c in s:
if '0' <= c <= '9':
digit = ord(c) - ord('0')
else:
digit = ord(c) - ord('A') + 10
result = result * base + digit
return result
def float_to_base(n, base):
"""将含小数的十进制数n转换为base进制"""
integer_part = int(n)
float_part = n - integer_part
result = dec_to_base(integer_part, base) + "."
fraction_digits = 10 # 小数部分保留10位
for i in range(fraction_digits):
float_part *= base
digit = int(float_part)
if digit < 10:
result += str(digit)
else:
result += chr(digit - 10 + ord('A'))
float_part -= digit
return result
def base_to_float(s, base):
"""将含小数的base进制数s转换为十进制"""
integer_part = 0
float_part = 0
dot_pos = s.find('.')
if dot_pos == -1:
integer_part = base_to_dec(s, base)
else:
integer_part = base_to_dec(s[:dot_pos], base)
float_part_str = s[dot_pos+1:]
for i in range(len(float_part_str)):
digit = float_part_str[i]
if '0' <= digit <= '9':
digit = ord(digit) - ord('0')
else:
digit = ord(digit) - ord('A') + 10
float_part += digit / pow(base, i+1)
return integer_part + float_part
# 示例
n = 123.456
base = 8
print(f"{n} (10) = {float_to_base(n, base)} ({base})")
print(f"{float_to_base(n, base)} ({base}) = {base_to_float(float_to_base(n, base), base)} (10)")
```
运行结果:
```
123.456 (10) = 173.34520314632 (8)
173.34520314632 (8) = 123.45599999999999 (10)
```
注意,由于计算机内部使用二进制表示数值,因此在进行进制转换时可能会出现精度误差。在上面的示例中,将123.456转换为8进制后再转回十进制时,结果最后一位有误差。如果需要更高精度的计算,可以使用Python内置的decimal模块。