协慌网

登录 贡献 社区

如何强制除法运算为浮点数?除数一直舍入到 0?

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

在下面的代码中,如何强制c

c = a / b

答案

在 Python 2 中,两个 int 的除法产生一个 int。在 Python 3 中,它产生一个浮点数。 __future__导入来获得新的行为。

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

c = a / float(b)来强制转换为 float。如果分子或分母是浮点数,则结果也将是。


注意事项:正如评论者指出的那样,如果b可能不是整数或浮点数(或表示一个的字符串),则这将无效。如果您可能要处理其他类型(例如复数),则需要检查这些类型或使用其他方法。

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

我有两个整数值 a 和 b,但是我需要它们在浮点数中的比率。我知道 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

operator模块operator.truediv(a, b) truediv也很健壮,但这可能会更慢,因为它是一个函数调用:

>>> 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