如何强制使除法为浮点数?除法总是舍入为0?

787 投票
11 回答
771828 浏览
提问于 2025-04-15 13:33

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

我该如何在Python 2中强制让 c 成为浮点数呢?

c = a / b

在3.x版本中,情况正好相反;有关这个相反的问题,请查看 为什么整数除法会得到浮点数而不是另一个整数?

11 个回答

212

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

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

我该如何在Python中强制c成为浮点数呢?

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模块中的truediv,即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
753

你可以通过这样做来把结果转换成浮点数:c = a / float(b)。如果分子或者分母是浮点数,那么结果也会是浮点数。


需要注意的是:正如评论者所提到的,如果b可能是除了整数或浮点数以外的其他类型(比如字符串或其他类型),那么这种方法就不适用了。如果你可能会遇到其他类型(比如复数),你需要检查这些类型,或者使用其他方法。

853

在Python 2中,两个整数相除会得到一个整数。而在Python 3中,相除的结果会变成一个小数。我们可以通过从 __future__ 导入来获得这种新的行为。

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

撰写回答