将浮点数转换为任意进制

3
如何在Python中将一个由字符串表示的浮点数转换为底数介于2到36之间的十进制数,而不使用Python内置的int和float函数? 意思是: convert_float("234.56", base) --> float,或者("10AB", base) --> float
如果浮点数以 .0 结尾,则结果应该是一个整数。
将整数转换为任何基数似乎要简单得多,但我无法想出或找到任何浮点数解决方案。

2
@MartijnPieters,0xff34.1a 对我来说很有意义。 - Peter Gibson
我的错误,我忘了提到我不能在该过程中使用int或float。 - nanachan
1
你自己有尝试过吗? - Martijn Pieters
4
为什么不能使用 int - Warren Weckesser
2
在内部,浮点数是二进制的,并且在非十进制基数中表示它们没有理论问题。一种方法可能是找到小数点,将其移除,转换为整数,然后乘以基数的点位置幂 - 本质上分别转换尾数和指数。 - Yann Vernier
显示剩余2条评论
1个回答

2

我认为你的想法已经很好了。要实现它,首先需要一个可以将字符串转换为整数的字典。然后,您需要在小数点处将字符串分割为两个部分。接下来,您可以反转您的“before”字符串并进行迭代,将当前值的整数乘以10的当前索引,并将所有这些值相加。

然后,遍历您的“after”字符串,并将当前值乘以负的当前索引,再次添加这些值。

将此转换为代码:

s2i = {"0": 0,
"1": 1,
"2": 2,
...
"Y": 34,
"Z": 35
}

def convert_float(s, base=10):
    ret = 0
    if "." not in s: bef = s
    else: bef, aft = s.split(".")
    for i in enumerate(reversed(bef)):
        integer = s2i[i[1]]
        if integer >= base: raise ValueError
        ret += base**i[0] * integer
    if "." not in s: return ret
    for i in enumerate(aft):
        integer = s2i[i[1]]
        if integer >= base: raise ValueError
        ret += base**-(i[0] + 1) * integer
    return ret

print convert_float("YF.1G90N", 36)

> 1239.04031674

感谢 @jazzpi 的清晰解释! - nanachan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接