8

次のような 2 進分数を表す文字列があるとします。

".1"

10 進数として、これは 0.5 です。Python でそのような文字列から数値型に変換する標準的な方法はありますか (2 進数か 10 進数かは厳密には重要ではありません)。

整数の場合、解決策は簡単です。

int("101", 2)
>>>5

int() はベースを提供するためにオプションの 2 番目の引数を取りますが、float() は取りません。

私はこれと機能的に同等のものを探しています(私は思う):

def frac_bin_str_to_float(num):
    """Assuming num to be a string representing
    the fractional part of a binary number with
    no integer part, return num as a float."""
    result = 0
    ex = 2.0
    for c in num:
        if c == '1':
            result += 1/ex 
        ex *= 2
    return result

いくつかのエッジケースを見逃しているかもしれませんが、それは私が望むことだと思います。

Pythonでこれを行う組み込みまたは標準の方法はありますか?

4

4 に答える 4

8

以下は、同じアルゴリズムを表現する短い方法です。

def parse_bin(s):
    return int(s[1:], 2) / 2.**(len(s) - 1)

文字列がドットで始まると仮定します。より一般的なものが必要な場合は、次のように整数部分と小数部分の両方を処理します。

def parse_bin(s):
    t = s.split('.')
    return int(t[0], 2) + int(t[1], 2) / 2.**len(t[1])

例えば:

In [56]: parse_bin('10.11')
Out[56]: 2.75
于 2012-12-01T19:36:52.773 に答える
1

ハードコードされた「2」を基数に置き換えると、James のコードを一般化して任意の数体系から変換することができます。

def str2float(s, base=10):
    dot, f = s.find('.') + 1, int(s.replace('.', ''), base)
    return f / float(base)**(len(s) - dot) if dot else f
于 2021-02-03T01:34:44.420 に答える