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


Answers:


807

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

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

13
请注意,from __future__ import division必须在文件的开头
yannis

同样的问题是,如果您想将整数除法放在文件的一个位置,而将浮点除法在文件的另一位置...
推杆0114 '19

1
@ mercury0114:没问题;您只//在需要楼层分割和/“ true”(float)分割时使用。
ShadowRanger

715

您可以通过执行此操作来浮动c = a / float(b)。如果分子或分母是浮点数,则结果也将是。


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


195

如何在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

truediv来自operator模块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

3
“ 1 // 2 = 0”,“ 1 // 2.0 = 0.0”-有趣的小陷阱,即使它是整数除法,如果任何操作数都是浮点数,那么结果是整数,而且也是浮点数。我正在使用整数除法来计算列表索引,因此出现错误。
R. Navega


66

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

from __future__ import division

在模块顶部。


30

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

例:

>>> 4.0/3
1.3333333333333333

要么,

>>> 4 / 3.0
1.3333333333333333

要么,

>>> 4 / float(3)
1.3333333333333333

要么,

>>> float(4) / 3
1.3333333333333333

4
但是您以后可能会很想这样做1.0 + 1/3或,float(c) + a/b或者float(a/b),答案会让您感到失望。最好使用python 3+或导入__future__.division模块(请参见接受的答案),以始终获得所需的答案。现有的除法规则会产生难以发现的隐性数学错误。
滚刀

@JoeCondron,您尝试过python -c 'a=10; b=3.0; print a/b'吗?
gsbabil

我不必这样做,因为它显然适用于这种情况。但是,a例如if 和'b'是整数值函数的输出吗?例如a = len(list1), b = len(list2)
JoeCondron 2015年

@JoeCondron:好点。我刚刚将答案更新为include float(..)。我认为乘以@ 1.0,如下面的@Pinochle所示,也可能有用。
gsbabil

21

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

>>> 4/3.
1.3333333333333333

2
如果分子和分母都是变量,您将如何应用这种方法?
stackoverflowuser2010

我假设您引用的是第一个示例,如果是的话,我只会float()在其中一个变量上使用。
亚历山大

13

这也可以

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

4
如果分子和分母都是变量,您将如何应用这种方法?
stackoverflowuser2010

1
因为当变量用于抽象时它不起作用。几乎没有有意义的代码具有像这样硬编码的值。
基尔·西蒙斯

1
该票数很少,因为此答案不能回答问题,也不是一个普遍的答案。在一个答案中,首先重要的是要显示为什么它有效。这很简单:如果分子或分母是浮点数,则结果将是浮点数。通常,您不使用python作为纯文本计算器,因此您需要一个变量a和的答案b
TimZaman

最长的时间,我实际上以为./是python中的有效运算符,可让您进行浮点除法。这就是为什么在任何编程语言中明智地使用空格的原因
smac89 '19

6

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

python -Q new foo.py

有一些缺点(来自PEP):

有人认为,更改默认值的命令行选项是有害的。如果使用不当,肯定会很危险:例如,不可能将需要-Qnew的第三方库软件包与需要-Qold的第三方库软件包结合使用。

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

有关除法更改的详细信息,请阅读:PEP 238-更改除法运算符


2
from operator import truediv

c = truediv(a, b)

2
但是,这不是理想的,因为在aint和bfloat 的情况下它不起作用。遵循相同思路的更好解决方案是先执行from operator import truediv再使用truediv(a, b)
Mark Dickinson

是啊,你说得对。我以这两个整数为前提,因为这是除法运算不同的唯一一次,但您确实需要一个通用的解决方案。我实际上不知道您可以导入运算符,还是对于浮数除数根本不起作用。答案已编辑。
JoeCondron

1
from operator import truediv

c = truediv(a, b)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.