如何强制使除法为浮点数?除法总是舍入为0?
我有两个整数值 a
和 b
,但我需要它们的浮点数比值。我知道 a < b
,我想计算 a / b
,所以如果我用整数除法的话,结果总是会是0,余数是 a
。
我该如何在Python 2中强制让 c
成为浮点数呢?
c = a / b
在3.x版本中,情况正好相反;有关这个相反的问题,请查看 为什么整数除法会得到浮点数而不是另一个整数?
11 个回答
如何在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
你可以通过这样做来把结果转换成浮点数:c = a / float(b)
。如果分子或者分母是浮点数,那么结果也会是浮点数。
需要注意的是:正如评论者所提到的,如果b
可能是除了整数或浮点数以外的其他类型(比如字符串或其他类型),那么这种方法就不适用了。如果你可能会遇到其他类型(比如复数),你需要检查这些类型,或者使用其他方法。
在Python 2中,两个整数相除会得到一个整数。而在Python 3中,相除的结果会变成一个小数。我们可以通过从 __future__
导入来获得这种新的行为。
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663