提问人:Nathan Fellman 提问时间:8/13/2009 最后编辑:Karl KnechtelNathan Fellman 更新时间:10/14/2022 访问量:765882
如何强制除法为浮点数?除法一直四舍五入到0?
How can I force division to be floating point? Division keeps rounding down to 0?
问:
我有两个整数值和 ,但我需要它们在浮点中的比率。我知道这一点,我想计算,所以如果我使用整数除法,我将始终得到 0 的余数。a
b
a < b
a / b
a
在下面的 Python 2 中,如何强制成为浮点数?c
c = a / b
在 3.x 中,行为是相反的;请参阅为什么整数除法会产生一个浮点数而不是另一个整数? 对于相反的 3.x 特定问题。
答:
c = a / (b * 1.0)
您可以通过执行以下操作来强制转换为浮动。如果分子或分母是浮点数,则结果也将是浮点数。c = a / float(b)
需要注意的是:正如评论者所指出的,如果可能不是整数或浮点数(或表示一个的字符串),这将不起作用。如果您可能正在处理其他类型(例如复数),则需要检查这些类型或使用其他方法。b
评论
__future__
b
float
1.0
float
__future__
float
int
在 Python 2 中,两个 int 的除法产生一个 int。在 Python 3 中,它生成一个浮点数。我们可以通过从 导入 来获取新行为。__future__
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
评论
a // b
from __future__ import division
在 Python 3.x 中,单斜杠 () 始终表示 true(非截断)除法。(运算符用于截断除法。在 Python 2.x(2.2 及更高版本)中,您可以通过将/
//
from __future__ import division
在模块的顶部。
只需以浮点格式进行除法的任何参数也会生成浮点格式的输出。
例:
>>> 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)
__future__.division
python -c 'a=10; b=3.0; print a/b'
a
a = len(list1), b = len(list2)
float(..)
1.0
这也将起作用
>>> u=1./5
>>> print u
0.2
评论
a
b
./
如果要默认使用“true”(浮点)除法,则有一个命令行标志:
python -Q new foo.py
有一些缺点(来自 PEP):
有人认为,命令行选项可以更改 默认值是邪恶的。在错误的情况下,这当然是危险的 手:例如,不可能将第三个手牌组合在一起 需要 -Qnew 的 party 库包和另一个 需要 -Qold。
您可以通过查看 python 手册页来了解有关更改/警告除法行为的其他标志值的更多信息。
有关除法变更的完整详细信息,请阅读: PEP 238 -- 更改除法运算符
添加点 () 以指示浮点数.
>>> 4/3.
1.3333333333333333
评论
float()
from operator import truediv
c = truediv(a, b)
评论
a
b
from operator import truediv
truediv(a, b)
如何在 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 的其他选项
如果您不想将其应用于整个模块,则只能使用一些解决方法。最流行的是将其中一个操作数强制为浮点数。一个强大的解决方案是 .在全新的 Python shell 中:a / (b * 1.0)
>>> 1/(2 * 1.0)
0.5
模块也健壮,但这可能较慢,因为它是一个函数调用:truediv
operator
operator.truediv(a, b)
>>> from operator import truediv
>>> truediv(1, 2)
0.5
不建议用于 Python 2
常见的是 。如果 b 是复数,这将引发 TypeError。由于定义了复数的除法,因此在为除数传递复数时不让除法失败对我来说是有意义的。a / float(b)
>>> 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
故意让你的代码更脆弱对我来说没有多大意义。
您也可以使用该标志运行 Python,但这有一个缺点,即使用新的 Python 3 行为执行所有模块,并且您的某些模块可能需要经典除法,因此除了测试之外,我不建议这样做。但要证明:-Qnew
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
评论
a / (b + 0.0)
from operator import truediv
c = truediv(a, b)
其中 a 是被除数,b 是除数。 当两个整数相除后的商为浮点数时,此函数很方便。
评论