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

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

提问人:Nathan Fellman 提问时间:8/13/2009 最后编辑:Karl KnechtelNathan Fellman 更新时间:10/14/2022 访问量:765882

问:

我有两个整数值和 ,但我需要它们在浮点中的比率。我知道这一点,我想计算,所以如果我使用整数除法,我将始终得到 0 的余数。aba < ba / ba

在下面的 Python 2 中,如何强制成为浮点数?c

c = a / b

在 3.x 中,行为是相反的;请参阅为什么整数除法会产生一个浮点数而不是另一个整数? 对于相反的 3.x 特定问题。

浮点 数除法 python-2.x

评论


答:

137赞 Pinochle 8/13/2009 #1
c = a / (b * 1.0)
752赞 Steve Trout 8/13/2009 #2

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


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

评论

0赞 Charlie 4/9/2015
我会将这两个操作数转换为浮点数,只是为了更清楚。只强制转换恰好触发特殊代码路径的那个会让许多阅读代码的人感到困惑。你也会陷入 Acute 所处的境地。
8赞 Antti Haapala -- Слава Україні 4/12/2015
这不是比使用 . 强制转换为 !正确的解决方法是将其他乘数乘以 。__future__bfloat1.0
0赞 Mark Ransom 9/18/2015
@AnttiHaapala是否存在强制转换为不起作用但起作用的特定情况?我希望未来的部门使用相同的方法作为其实施策略。乘以 1.0 与铸造浮动有何不同?float__future__
2赞 Antti Haapala -- Слава Україні 9/18/2015
例如,如果强制转换的参数不是 a 或 already,它将失败。PEP 238 中详细讨论了正确的方法。floatint
851赞 Michael Fairley 8/13/2009 #3

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

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

评论

91赞 Steve Trout 8/13/2009
如果你走这条路,仍然需要一些整数除法,你可以像这样做a // b
34赞 Sam DeFabbia-Kane 8/13/2009
请注意,在 Python 3 中,这是默认行为。
7赞 hobs 9/23/2011
这也是 Idle (ipython) shell 中的默认行为,但不是 ipython 脚本解释器,这在调试默认系统 python 解释器运行的脚本时确实会引起头痛。
4赞 Caltor 10/3/2013
不过,这不会改变 operator.div 的行为。为此,请使用 operator.truediv()。
19赞 yannis 8/21/2017
请注意,它必须位于文件的开头from __future__ import division
67赞 newacct 8/13/2009 #4

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

from __future__ import division

在模块的顶部。

32赞 gsbabil 9/24/2010 #5

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

例:

>>> 4.0/3
1.3333333333333333

套利

>>> 4 / 3.0
1.3333333333333333

套利

>>> 4 / float(3)
1.3333333333333333

套利

>>> float(4) / 3
1.3333333333333333

评论

5赞 hobs 9/23/2011
但你以后可能会想做或或,你会对答案感到失望。最好使用 python 3+ 或导入模块(请参阅已接受的答案),以始终获得您期望的答案。现有的除法规则会产生阴险的、难以追踪的数学错误。1.0 + 1/3float(c) + a/bfloat(a/b)__future__.division
0赞 gsbabil 9/19/2015
@JoeCondron 你试过了吗?python -c 'a=10; b=3.0; print a/b'
0赞 JoeCondron 9/19/2015
我不必这样做,因为它显然适用于这种情况。但是,例如,if 和 'b' 是整数值函数的输出呢?例如,.aa = len(list1), b = len(list2)
0赞 gsbabil 9/19/2015
@JoeCondron:好点子。我刚刚更新了答案以包括.我认为乘以 ,正如下面@Pinochle建议的那样,也可能有用。float(..)1.0
14赞 Gaurav Agarwal 12/25/2013 #6

这也将起作用

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

评论

5赞 stackoverflowuser2010 8/13/2016
如果分子和分母都是变量,您将如何应用这种方法?
1赞 Keir Simmons 3/2/2017
因为当变量用于抽象时,它不起作用。几乎没有任何有意义的代码具有像这样硬编码的值。
1赞 TimZaman 8/7/2017
这几乎没有选票,因为这个答案没有回答问题,而且根本不是一个一般的答案。在回答中,首先要说明为什么这样做也很重要。这很简单:如果分子或分母是浮点数,则结果将是浮点数。通常你不会使用 python 作为纯文本计算器,所以你想要变量和 的答案。ab
0赞 smac89 11/29/2019
在很长一段时间里,我实际上认为 python 中有一个有效的运算符,可以让你进行浮点除法。这就是为什么在任何编程语言中明智地使用空格都是好的./
7赞 stephenbez 1/8/2014 #7

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

python -Q new foo.py

有一些缺点(来自 PEP):

有人认为,命令行选项可以更改 默认值是邪恶的。在错误的情况下,这当然是危险的 手:例如,不可能将第三个手牌组合在一起 需要 -Qnew 的 party 库包和另一个 需要 -Qold。

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

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

22赞 Alexander 11/22/2014 #8

添加点 () 以指示浮点数.

>>> 4/3.
1.3333333333333333

评论

3赞 stackoverflowuser2010 8/13/2016
如果分子和分母都是变量,您将如何应用这种方法?
0赞 Alexander 8/14/2016
我假设您参考了第一个示例,如果是这样,我只会在其中一个变量上使用。float()
2赞 JoeCondron 9/18/2015 #9
from operator import truediv

c = truediv(a, b)

评论

2赞 Mark Dickinson 9/18/2015
不过,这并不理想,因为它在 int 和 float 的情况下不起作用。沿着同样的思路,一个更好的解决方案是 do 然后使用 .abfrom operator import truedivtruediv(a, b)
0赞 JoeCondron 9/18/2015
是的,你是对的。我假设两个整数,因为这是除法运算唯一一次不同,但你真的想要一个通用解决方案。我实际上并不知道您可以导入运算符,也不知道它对浮点除数根本不起作用。答案已编辑。
210赞 Russia Must Remove Putin 9/19/2015 #10

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

模块也健壮,但这可能较慢,因为它是一个函数调用:truedivoperatoroperator.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

评论

4赞 R. Navega 12/17/2018
“1 // 2 = 0”, “1 // 2.0 = 0.0” -- 有趣的小问题,即使它是一个整数除法,如果任何一个操作数是浮点数,那么结果是一个整数,但也是浮点数。我使用整数除法来计算列表索引,并因此出现错误。
0赞 Mark Ransom 7/20/2022
我更喜欢因为加法通常比乘法快,即使差异可以忽略不计。a / (b + 0.0)
-1赞 Chetan Yeshi 1/8/2016 #11
from operator import truediv

c = truediv(a, b)

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

评论

0赞 Sneftel 8/26/2022
其他答案已经涵盖了这一点。