Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将分数转换为浮点数?_Python_Parsing - Fatal编程技术网

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 the
split(“/”)
,使其一致。此外,与其引入
符号多变量
变量,不如使用两个计算更简单的返回语句。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