尝试将浮点数字符串从基数 X 转换为基数 10



我正在尝试将字符串从任何基数 (2-36( 转换为基数 10。 字符串将包含分数。在下面的代码中,我正在尝试使用 int(( ton 转换。 我是否需要循环浏览字符串中的每个字符并根据位值逐个转换?

到目前为止的代码和结果:

def is_valid_strfrac(s, base=2):
return all([is_valid_strdigit(c, base) for c in s if c != '.']) 
and (len([c for c in s if c == '.']) <= 1)

def eval_strfrac(s, base=2):
assert is_valid_strfrac(s, base), "'{}' contains invalid digits for a base-{} number.".format(s, base)
int(s, base)

print("start")    
print(eval_strfrac('100.101', 2))
print("end")

开始


ValueError                                Traceback (most recent call last)
<ipython-input-11-83ab061d710b> in <module>()
9 
10 print("start")
---> 11 print(eval_strfrac('100.101', 2))
12 print("end")
<ipython-input-11-83ab061d710b> in eval_strfrac(s, base)
6    # numerals = "0123456789abcdefghijklmnopqrstuvwxyz"
7    # return sum(numerals.index(x)*base**i for i, x in enumerate(s[::-1]))
----> 8     int(s, base)
9 
10 print("start")
ValueError: invalid literal for int() with base 2: '100.101'

修改以显示is_valid_strdigit:

def is_valid_strdigit(c, base=2):
if type (c) is not str: return False # Reject non-string digits
if (type (base) is not int) or (base < 2) or (base > 36): return False # Reject non-integer bases outside 2-36
if base < 2 or base > 36: return False # Reject bases outside 2-36
if len (c) != 1: return False # Reject anything that is not a single character
if '0' <= c <= str (min (base-1, 9)): return True # Numerical digits for bases up to 10
if base > 10 and 0 <= ord (c) - ord ('a') < base-10: return True # Letter digits for bases > 10
return False # Reject everything else

100.101 底数 2 应变为 4.625 底数 10。

您可以执行以下操作来从字符串中检索整数部分和小数部分:

s = "100.101" #Assuming s was valiated as a valid string
x = 2 #Source base
#Find integer part and decimal part
parts = s.split('.')
if len(parts) == 2:
integerPart, decimalPart = parts[0], parts[1]
elif len(parts) == 1:
if '.' in s:
integerPart, decimalPart = "", parts[0]
else:
integerPart, decimalPart = parts[0], ""
else:
raise Exception("Invalid number.")

您还可以使用正则表达式将字符串拆分为整数部分和小数部分:

import re
s = "100.101" #Assuming s was valiated as a valid string
x = 2 #Source base
m = re.search('(?P<integer>d*).?(?P<decimal>d*)', s)
integerPart, decimalPart = m.group("integer"), m.group("decimal")

然后遍历整数和小数字符串中的字符以将数字相加:

#Iterate over integer and decimal parts to sum digits
result = sum([(x ** i) * int(c) for i, c in enumerate(integerPart[::-1])]) + sum([(x ** -(i + 1 )) * int(c) for i, c in enumerate(decimalPart)])
print(result) #prints 4.625

'100.101' == '100101/1000' (仍在 base2 中(

你可以通过像这样"扩展"你的数字,转换两个部分(100101->37,1000 -> 8(并只做除法来获得相同的结果。 ;)

让我们这样做:

base = 2
s = "100.101"
separated = s.split(".")
merged = "".join(separated)
dot_position = len(separated[1]) if len(separated) > 1 else 0
divisor = base ** dot_position
converted = int(merged, base=base) / divisor

最新更新