将分数转换为浮点数?

mpe*_*pen 23 python parsing

有点像这个问题,但相反.

给定一个串像1,1/2或者1 2/3,什么是将其转换成一个浮动的最好方法?我正在考虑逐个使用正则表达式,但也许有人知道更好的方法,或者预先存在的解决方案.我希望我可以使用eval,但我认为第三种情况可以防止这种情况发生.

new*_*cct 37

也许是这样的(2.6+)

from fractions import Fraction
float(sum(Fraction(s) for s in '1 2/3'.split()))
Run Code Online (Sandbox Code Playgroud)

  • 这不会正确处理负数.例如,`-1 2/3`应该是-1.666而不是-0.333. (5认同)

mpe*_*pen 8

我稍微调整了詹姆斯的回答.

def convert_to_float(frac_str):
    try:
        return float(frac_str)
    except ValueError:
        num, denom = frac_str.split('/')
        try:
            leading, num = num.split(' ')
            whole = float(leading)
        except ValueError:
            whole = 0
        frac = float(num) / float(denom)
        return whole - frac if whole < 0 else whole + frac


print convert_to_float('3') # 3.0
print convert_to_float('3/2') # 1.5
print convert_to_float('1 1/2') # 1.5
print convert_to_float('-1 1/2') # -1.5
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/ItifKv


Dav*_*ave 6

虽然你应该完全避开eval.也许是一些更精致的版本:

num,den = s.split( '/' )
wh, num = num.split()
result = wh + (float(num)/float(den))
Run Code Online (Sandbox Code Playgroud)

对不起,意思是num.split而不是s.split和强制转换.编辑.