Python 将分数转换为浮点数?
有点像,但正好相反Python 将分数转换为浮点数?,python,parsing,Python,Parsing,有点像,但正好相反 给定像1、1/2或1 2/3这样的字符串,将其转换为浮点的最佳方法是什么?我正在考虑在个案的基础上使用正则表达式,但也许有人知道一种更好的方法,或者一种预先存在的解决方案。我希望我可以只使用eval,但我认为第三种情况会阻止这种情况发生。这可能是一个肮脏的解决办法,但您可以将空格转换为+符号来解决第三种情况(如果分数为负数,则转换为-)取决于您希望为分数支持的语法,eval(“+”.join(s.split())(使用真正的除法——即Python 3或Python 2中的“未
给定像
1
、1/2
或1 2/3
这样的字符串,将其转换为浮点的最佳方法是什么?我正在考虑在个案的基础上使用正则表达式,但也许有人知道一种更好的方法,或者一种预先存在的解决方案。我希望我可以只使用eval
,但我认为第三种情况会阻止这种情况发生。这可能是一个肮脏的解决办法,但您可以将空格转换为+
符号来解决第三种情况(如果分数为负数,则转换为-
)取决于您希望为分数支持的语法,eval(“+”.join(s.split())
(使用真正的除法——即Python 3或Python 2中的“未来”导入除法的)可能会起作用。它将特别涵盖您提到的所有情况。,但您应该完全避开eval。也许是以下更精练的版本:
num,den = s.split( '/' )
wh, num = num.split()
result = wh + (float(num)/float(den))
抱歉,应该是num.split而不是s.split,并强制转换为.Edited。可能是这样的(2.6+)
此实现避免了使用eval,并适用于Python的2.6之前版本
# matches a string consting of an integer followed by either a divisor
# ("/" and an integer) or some spaces and a simple fraction (two integers
# separated by "/")
FRACTION_REGEX = re.compile(r'^(\d+)(?:(?:\s+(\d+))?/(\d+))?$')
def parse(x):
i, n, d = FRACTION_REGEX.match(x).groups()
if d is None: n, d = 0, 1 # if d is None, then n is also None
if n is None: i, n = 0, i
return float(i) + float(n) / float(d)
要测试:
>>> for x in ['1', '1/2', '1 2/3']: print(repr(parse(x)))
...
1.0
0.5
1.6666666666666665
我看到这里已经有好几个很好的答案了,但我很幸运。它还有一个好处,就是如果你解析混合数据集,它可以容忍非分数字符串,所以不需要预先检查它是否是分数字符串
def convert_to_float(frac_str):
try:
return float(frac_str)
except ValueError:
try:
num, denom = frac_str.split('/')
except ValueError:
return None
try:
leading, num = num.split(' ')
except ValueError:
return float(num) / float(denom)
if float(leading) < 0:
sign_mult = -1
else:
sign_mult = 1
return float(leading) + sign_mult * (float(num) / float(denom))
它还可以处理“21/1e-8”、“1/3”和“1/5e3”。我稍微调整了一下
def将浮点数转换为浮点数(frac\u str):
尝试:
回油浮动(压裂)
除值错误外:
num,denom=frac_str.split(“/”)
尝试:
前导,num=num.split(“”)
整体=浮动(前导)
除值错误外:
整体=0
分形=浮点数/浮点数
如果整数值小于0,则返回整数值-分形,否则返回整数值+分形
打印转换为浮点数('3')3.0
打印转换为浮点数('3/2')#1.5
打印转换为浮点数('1 1/2')#1.5
打印将_转换为_浮点('-1/2')#-1.5
不仅更加优雅,而且最精确的齿无法正确处理负数。例如,-1 2/3
应该是-1.666而不是-0.333。它似乎失败了,因为它在求和之前分别处理整数和分数。如此接近于干净和功能!似乎可以使用-/+条带过滤器稍后在输出浮点之后。不包括我问题中的一个示例,1 1/2
(一个半)。现在进行编辑以处理该问题。看起来你打破了“只是一个分数”的情况,例如,1/3
。这看起来好一点。嘿……你对上一个测试案例撒了谎。'-3 1/2'
导致了-2.5
。谢谢马克,一切都解决了!不,先生,你打破了正整数+分数的情况。当前导
为正时,你得到了谁le+(frac*-1*0)
这当然会删除小数部分。好的,马克,我想我这次真的得到了(尽管现在我还是有点偏执,我还是遗漏了一些东西。谢谢你检查我的工作!convert_to_float('x')
返回None
,而convert_to_float('x/y'))引发
ValueError。我会去掉
try/except`about thesplit(“/”)
,使其一致。此外,与其引入符号多变量
变量,不如使用两个计算更简单的返回语句。1)eval在这方面是危险的过度使用。2)为什么拆分并转换字符串只是为了将其重新连接在一起?为什么不使用eval(s)
?@NedBatchelder尝试在没有拆分的情况下执行此操作,它将无法作为浮点值工作,因此计算结果为0。
>>> s="1/2"
>>> eval('/'.join(map(str,map(float,s.split("/")))))
0.5
>>> s="3/5"
>>> eval('/'.join(map(str,map(float,s.split("/")))))
0.59999999999999998
def convert_to_float(frac_str):
try:
return float(frac_str)
except ValueError:
try:
num, denom = frac_str.split('/')
except ValueError:
return None
try:
leading, num = num.split(' ')
except ValueError:
return float(num) / float(denom)
if float(leading) < 0:
sign_mult = -1
else:
sign_mult = 1
return float(leading) + sign_mult * (float(num) / float(denom))
>>> convert_to_float('3')
3.0
>>> convert_to_float('1/4')
0.25
>>> convert_to_float('1 2/3')
1.6666666666666665
>>> convert_to_float('-2/3')
-0.6666666666666666
>>> convert_to_float('-3 1/2')
-3.5
def fractionToFloat(fraction):
num = 0
mult = 1
if fraction[:1] == "-":
fraction = fraction[1:]
mult = -1
if " " in fraction:
a = fraction.split(" ")
num = float(a[0])
toSplit = a[1]
else:
toSplit = fraction
frac = toSplit.split("/")
num += float(frac[0]) / float(frac[1])
return num * mult
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