768

我有两个整数值ab,但我需要它们的浮点比率。我知道这一点a < b,我想计算a / b,所以如果我使用整数除法,我总是会得到 0,余数为a

如何c在下面的 Python 2 中强制成为浮点数?

c = a / b
4

11 回答 11

840

在 Python 2 中,两个整数相除产生一个整数。在 Python 3 中,它产生一个浮点数。我们可以通过导入 from 来获得新的行为__future__

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
于 2009-08-12T18:28:26.193 回答
738

你可以通过做c = a / float(b). 如果分子或分母是浮点数,那么结果也是。


b一个警告:正如评论者所指出的,如果可能不是整数或浮点数(或表示一的字符串),这将不起作用。如果您可能正在处理其他类型(例如复数),则需要检查这些类型或使用不同的方法。

于 2009-08-12T18:28:02.170 回答
204

如何在 Python 中强制除法为浮点数?

我有两个整数值 a 和 b,但我需要它们的浮点比率。我知道 a < b 并且我想计算 a/b,所以如果我使用整数除法,我总是会得到 0 和 a 的余数。

如何在下面强制 c 成为 Python 中的浮点数?

c = a / b

这里真正要问的是:

“我如何强制进行真正的除法以a / b返回分数?”

升级到 Python 3

在 Python 3 中,要获得真正的除法,您只需执行a / b.

>>> 1/2
0.5

整数除法的经典除法行为现在是a // b

>>> 1//2
0
>>> 1//2.0
0.0

但是,您可能无法使用 Python 2,或者您可能正在编写必须同时在 2 和 3 中工作的代码。

如果使用 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 2 的其他选项

如果您不想将此应用于整个模块,则只能使用一些解决方法。最流行的是将其中一个操作数强制为浮点数。一种稳健的解决方案是a / (b * 1.0). 在新的 Python shell 中:

>>> 1/(2 * 1.0)
0.5

truediv来自operatormodule也很健壮operator.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
于 2015-09-18T17:29:08.573 回答
136
c = a / (b * 1.0)
于 2009-08-12T18:26:57.507 回答
66

在 Python 3.x 中,单斜杠 ( /) 始终表示真正的(非截断)除法。(该//运算符用于截断除法。)在 Python 2.x(2.2 及更高版本)中,您可以通过将

from __future__ import division

在模块的顶部。

于 2009-08-12T18:30:30.433 回答
31

仅以浮点格式制作除法的任何参数也会产生浮点输出。

例子:

>>> 4.0/3
1.3333333333333333

或者,

>>> 4 / 3.0
1.3333333333333333

或者,

>>> 4 / float(3)
1.3333333333333333

或者,

>>> float(4) / 3
1.3333333333333333
于 2010-09-24T06:22:39.360 回答
23

添加一个点 ( .) 表示浮点数

>>> 4/3.
1.3333333333333333
于 2014-11-22T14:39:24.147 回答
15

这也将起作用

>>> u=1./5
>>> print u
0.2
于 2013-12-24T19:58:41.563 回答
6

如果你想默认使用“真”(浮点)除法,有一个命令行标志:

python -Q new foo.py

有一些缺点(来自 PEP):

有人认为,更改默认值的命令行选项是邪恶的。用错人手肯定会很危险:例如,不可能将需要 -Qnew 的第 3 方库包与需要 -Qold 的另一个库包结合起来。

您可以通过查看 python 手册页了解更多关于更改/警告除法行为的其他标志值的信息。

有关部门更改的完整详细信息,请阅读:PEP 238 -- 更改部门运算符

于 2014-01-07T18:33:47.397 回答
2
from operator import truediv

c = truediv(a, b)
于 2015-09-18T10:04:34.937 回答
1
from operator import truediv

c = truediv(a, b)

其中a是被除数,b是除数。当两个整数相除后的商是浮点数时,这个函数很方便。

于 2016-01-08T05:23:18.663 回答