a
和b
,但是我需要它们在浮点数中的比率。我知道a < b
和我要计算a / b
,所以如果我使用整数除法,我总是得到0,剩下的a
。如何强制
c
是Python中的浮点数在下面?c = a / b
#1 楼
在Python 2中,两个整数的除法产生一个整数。在Python 3中,它产生一个浮点数。我们可以通过从__future__
导入来获得新的行为。>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
评论
请注意,来自__future__的导入分区必须位于文件的开头
– yannis
17年8月20日在17:50
同样的问题是如果您想将整数除法放在文件的一个位置而将浮点除法在文件的另一位置...
– Mercury0114
19年7月23日在10:26
@ mercury0114:没问题;您只需要//进行地板分割,和/或进行“ true”(浮动)分割。
–ShadowRanger
2月4日14:01
#2 楼
您可以通过执行c = a / float(b)
将其强制转换为浮动。如果分子或分母为浮点数,则结果也将为浮点数。警告:正如评论者所指出的,如果
b
可能不是整数,那将不起作用。整数或浮点数(或代表一个的字符串)。如果您要处理其他类型(例如复数),则需要检查这些类型或使用其他方法。#3 楼
如何在Python中强制除法为浮点数?
我有两个整数值a和b,但是我需要它们在浮点数中的比率。我知道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
评论
“ 1 // 2 = 0”,“ 1 // 2.0 = 0.0”-有趣的小陷阱,即使它是整数除法,如果任何操作数都是浮点数,那么结果是整数,而且也是浮点数。我正在使用整数除法来计算列表索引,因此出现错误。
–R。Navega
18/12/16在20:46
#4 楼
c = a / (b * 1.0)
#5 楼
在Python 3.x中,单斜杠(/
)始终表示真实(非截断)除法。 (//
运算符用于截断除法。)在Python 2.x(2.2及更高版本)中,您可以通过将from __future__ import division
放在模块顶部。
#6 楼
只需以浮点格式进行除法的任何参数也会产生浮点输出。示例:
>>> 4.0/3
1.3333333333333333
或,
>>> 4 / 3.0
1.3333333333333333
或者,
>>> 4 / float(3)
1.3333333333333333
或者,
>>> float(4) / 3
1.3333333333333333
评论
但是您以后可能会倾向于执行1.0 + 1/3或float(c)+ a / b或float(a / b),答案会令您失望。最好使用python 3+或导入__future __。division模块(请参阅接受的答案),以始终获得所需的答案。现有的除法规则会产生难以发现的隐性数学错误。
–滚刀
2011-09-23 4:47
@JoeCondron您是否尝试过python -c'a = 10; b = 3.0;打印a / b'?
–gsbabil
15年9月18日在18:51
我不必这样做,因为它显然可以在这种情况下工作。但是,如果a和'b'是整数值函数的输出,该怎么办?例如,a = len(list1),b = len(list2)。
– JoeCondron
2015年9月18日在20:44
@JoeCondron:好点。我刚刚更新了答案,使其包含float(..)。我认为乘以1.0(如下面@Pinochle所建议)也可能有用。
–gsbabil
2015年9月18日在21:18
#7 楼
加一个点(.
)表示浮点数>>> 4/3.
1.3333333333333333
评论
如果分子和分母都是变量,您将如何应用这种方法?
–stackoverflowuser2010
16年8月12日在19:03
我假设您引用的是第一个示例,如果是的话,我只会在其中一个变量上使用float()。
–亚历山大
16年8月13日20:00
#8 楼
这也将起作用>>> u=1./5
>>> print u
0.2
评论
如果分子和分母都是变量,您将如何应用这种方法?
–stackoverflowuser2010
16年8月12日在19:02
因为当变量用于抽象时它不起作用。几乎没有有意义的代码具有像这样硬编码的值。
– Keir Simmons
17 Mar 2 '17 at 6:01
该票数很少,因为此答案不能回答问题,也不是一个普遍的答案。在回答问题时,首先要说明为什么这样做也很重要。这很简单:如果分子或分母是浮点数,则结果将是浮点数。通常,您不使用python作为纯文本计算器,因此您需要答案a和b。
– TimZaman
17年8月7日在8:51
最长的时间,我实际上以为./是python中的有效运算符,可让您进行浮点除法。这就是在任何编程语言中明智地使用空格的原因
–smac89
19年11月28日在22:50
#9 楼
如果默认情况下要使用“ true”(浮点)除法,则有一个命令行标志:python -Q new foo.py
有一些缺点(来自PEP):
有人认为,更改默认值的命令行选项是邪恶的。错误地使用
当然很危险:例如,不可能将需要-Qnew的第三个
第三方库程序包与需要-Qold的另一个第三方库程序包组合在一起。
您可以通过查看python手册页来了解有关更改/警告除法行为的其他标志值的更多信息。
有关详细信息关于除法更改的信息,请阅读:PEP 238-更改除法运算符
#10 楼
from operator import truediv
c = truediv(a, b)
评论
不过,这并不理想,因为在a为int且b为浮点数的情况下,它不起作用。同样的更好的解决方案是从操作员导入truediv,然后使用truediv(a,b)。
–马克·迪金森(Mark Dickinson)
15/09/18在12:39
是啊,你说得对。我以这两个整数为前提,因为这是除法运算不同的唯一一次,但您确实需要一个通用的解决方案。我实际上不知道您可以导入运算符,还是对于浮数除数根本不起作用。答案已编辑。
– JoeCondron
2015年9月18日14:17
#11 楼
from operator import truediv
c = truediv(a, b)
其中a是除数,b是除数。
当两个整数相除后的商是浮点数时,此函数非常有用。
评论
只需升级到Python3。