我有两个整数值a和b,但我需要它们在浮点数中的比值。我知道a < b,我想计算a / b,所以如果我用整数除法,我总是得到0,余数是a。
如何在以下Python 2中强制c为浮点数?
c = a / b
在3。X,行为是相反的;参见为什么整数除法产生一个浮点数而不是另一个整数?反之为3。x-specific问题。
我有两个整数值a和b,但我需要它们在浮点数中的比值。我知道a < b,我想计算a / b,所以如果我用整数除法,我总是得到0,余数是a。
如何在以下Python 2中强制c为浮点数?
c = a / b
在3。X,行为是相反的;参见为什么整数除法产生一个浮点数而不是另一个整数?反之为3。x-specific问题。
你可以用c = a / float(b)来转换为float。如果分子或分母是浮点数,则结果为also。
警告:正如评论者指出的那样,如果b不是整数或浮点数(或表示浮点数的字符串),这将不起作用。如果你可能要处理其他类型(比如复数),你需要检查或者使用不同的方法。
在python2中,两个整型的除法得到一个整型。在Python 3中,它产生一个浮点数。我们可以通过从__future__导入来获得新的行为。
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
在Python 3中。X,单斜杠(/)总是表示真(非截断)除法。(//运算符用于截断除法。)在Python 2中。X(2.2及以上),您可以通过放置一个
from __future__ import division
在模块的顶部。
只要将任何用于除法的参数设置为浮点格式,也会产生浮点格式的输出。
例子:
>>> 4.0/3
1.3333333333333333
or,
>>> 4 / 3.0
1.3333333333333333
or,
>>> 4 / float(3)
1.3333333333333333
or,
>>> float(4) / 3
1.3333333333333333
如果你想默认使用"true"(浮点)除法,有一个命令行标志:
python -Q new foo.py
这里有一些缺点(来自PEP):
有人认为,命令行选项可以更改 违约是邪恶的。如果做错了,肯定会很危险 手:举个例子,不可能组合第三个手 需要-Qnew的party库包与另一个 需要-Qold。
通过查看python手册页,您可以了解更多关于更改/警告除法行为的其他标志值。
有关除法更改的详细信息,请参阅:PEP 238—更改除法操作符
如何在Python中强制除法为浮点数? 我有两个整数值a和b,但我需要它们在浮点数中的比值。我知道a < b,我想计算a/b,所以如果我用整数除法,我总是得到0,余数是a。 如何在下面的Python中强制c为浮点数? C = a / b
这里真正被问到的是:
"如何强制真除法使a / b返回一个分数"
升级至python3
在python3中,要得到真正的除法,只需执行a / b。
>>> 1/2
0.5
整数的经典除法现在是a // b:
>>> 1//2
0
>>> 1//2.0
0.0
然而,你可能会被困在使用python2中,或者你可能正在编写必须在python2和python3中工作的代码。
如果使用Python 2
在Python 2中,没有这么简单。处理经典Python 2除法的一些方法比其他方法更好、更健壮。
Python 2推荐
你可以在任何给定的模块中通过下面的导入来获得Python 3除法行为:
from __future__ import division
然后将Python 3样式的除法应用于整个模块。它在python shell中也可以在任何给定的点上工作。在Python 2中:
>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
这确实是最好的解决方案,因为它可以确保模块中的代码与Python 3更加兼容。
Python的其他选项
如果您不想将此应用于整个模块,则只能使用一些变通方法。最流行的方法是将其中一个操作数强制为浮点数。一个健壮的解决方案是a / (b * 1.0)。在一个新的Python shell中:
>>> 1/(2 * 1.0)
0.5
同样鲁棒的是来自operator模块operator的truediv。Truediv (a, b),但这可能更慢,因为它是一个函数调用:
>>> from operator import truediv
>>> truediv(1, 2)
0.5
Python 2不推荐使用
常见的是a / float(b)。如果b是一个复数,这将引发TypeError。因为定义了复数除法,所以当除法被传递一个复数作为除数时,它不会失败,这对我来说是有意义的。
>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
对我来说,故意让代码变得更脆弱没有多大意义。
你也可以使用-Qnew标志运行Python,但这有一个缺点,即使用新的Python 3行为执行所有模块,并且某些模块可能需要经典除法,所以我不建议这样做,除非用于测试。但是为了证明:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
from operator import truediv
c = truediv(a, b)
a是被除数,b是除数。 当两个整数除法后的商为浮点数时,此函数非常方便。