关于python:如何强制除法成为浮点?除法一直四舍五入到0?

How can I force division to be floating point? Division keeps rounding down to 0?

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

如何在下面的python中将c强制为浮点数?

1
c = a / b

在python 2中,两个int的除法产生一个int。在python 3中,它产生一个float。我们可以通过从__future__进口来获得新的行为。

1
2
3
4
5
6
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663


您可以通过执行c = a / float(b)来强制转换为float。如果分子或分母是浮点数,那么结果也将是。

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


How can I force division to be floating point in Python?

I have two integer values a and b, but I need their ratio in floating point. I know that a < b and I want to calculate a/b, so if I use integer division I'll always get 0 with a remainder of a.

How can I force c to be a floating point number in Python in the following?

1
c = a / b

这里真正要问的是:

"我如何强制真正的除法,使a / b返回一个分数?"

升级至python 3

在python 3中,要得到真正的除法,只需执行a / b

1
2
>>> 1/2
0.5

楼层划分,整数的经典划分行为,现在是a // b

1
2
3
4
>>> 1//2
0
>>> 1//2.0
0.0

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

如果使用python 2

在Python2中,这并不简单。与其他方法相比,处理经典的python 2划分的一些方法更好、更健壮。

关于python 2的建议

您可以在任何给定模块中获得python 3划分行为,并在顶部导入以下内容:

1
from __future__ import division

然后将python 3样式划分应用于整个模块。它还可以在任何给定点的python shell中工作。在Python 2中:

1
2
3
4
5
6
7
>>> 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壳中:

1
2
>>> 1/(2 * 1.0)
0.5

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

1
2
3
>>> from operator import truediv
>>> truediv(1, 2)
0.5

不推荐用于python 2

常见的是a / float(b)。如果b是复数,这将引发类型错误。因为除法是用复数来定义的,所以当给除数传递一个复数时,我认为除法不会失败是有意义的。

1
2
3
4
5
6
>>> 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行为来执行所有模块,并且您的一些模块可能需要经典的划分,所以我不建议这样做,除了测试。但为了证明:

1
2
3
4
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j


1
c = a / (b * 1.0)

在python 3.x中,单斜杠(/)总是表示真(非截断)除法。(//运算符用于截断除法。)在python 2.x(2.2及更高版本)中,通过将

1
from __future__ import division

在模块的顶部。


仅仅以浮点格式生成任何用于除法的参数也会以浮点格式生成输出。

例子:

1
2
>>> 4.0/3
1.3333333333333333

或者,

1
2
>>> 4 / 3.0
1.3333333333333333

或者,

1
2
>>> 4 / float(3)
1.3333333333333333

或者,

1
2
>>> float(4) / 3
1.3333333333333333


加一个点(.表示浮点数

1
2
>>> 4/3.
1.3333333333333333

1
2
3
>>> from __future__ import division
>>> 4/3
1.3333333333333333


这也行

1
2
>>> u=1./5
>>> print u

0.2


如果执行两个整数的除法,python将返回一个整数,那么需要执行以下操作:

1
c = float(a)/b

1
c = a/float(b)

然后得到c作为float类型


如果要默认使用"真"(浮点)除法,则有一个命令行标志:

1
python -Q new foo.py

有一些缺点(来自政治公众人物):

It has been argued that a command line option to change the
default is evil. It can certainly be dangerous in the wrong
hands: for example, it would be impossible to combine a 3rd
party library package that requires -Qnew with another one that
requires -Qold.

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

有关部门变更的详细信息,请阅读:PEP 238——更改部门操作员


1
2
3
from operator import truediv

c = truediv(a, b)


This will also work

u=1./5
print u

< /块引用>< /块引用>

1
0.2

12月24日13时19:58回答Gaurav Agarwal 67172279140

< /块引用>

感谢Gauraw,这是一个很好的解决方案。如果分子和分母都是变量,"解决方案"可能是乘以1。按商计算。

例子:

1
2
3
4
5
6
aa = 2
bb = 3

aa / bb = 0

1. * aa / bb = 0.6666666666666666

;-)

马克斯-意大利


1
2
3
from operator import truediv

c = truediv(a, b)

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