如何强制将除法转换为浮点数?除法总是向下舍入为 0?
- 2024-11-20 08:44:00
- admin 原创
- 8
问题描述:
我有两个整数值a
和b
,但我需要它们的浮点数比率。我知道这一点a < b
,我想计算a / b
,因此如果我使用整数除法,我将始终得到 0 和余数a
。
在下面的 Python 2 中,如何强制c
将其变为浮点数?
c = a / b
在 3.x 中,行为是相反的;请参阅为什么整数除法会产生浮点数而不是另一个整数?以了解相反的、特定于 3.x 的问题。
解决方案 1:
在 Python 2 中,两个整数相除会产生一个整数。在 Python 3 中,会产生一个浮点数。我们可以通过从 导入来获得新的行为__future__
。
>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
解决方案 2:
您可以通过执行以下操作将其转换为浮点数c = a / float(b)
。如果分子或分母是浮点数,则结果也将是浮点数。
需要注意的是:正如评论者指出的那样,如果b
可能是整数或浮点数以外的其他数字(或表示数字的字符串),则此方法无效。如果您可能要处理其他类型(例如复数),则需要检查这些类型或使用其他方法。
解决方案 3:
如何在 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
对于我来说,故意让代码变得更脆弱没有多大意义。
您也可以使用该标志运行 Python -Qnew
,但这样做的缺点是使用新的 Python 3 行为执行所有模块,并且您的某些模块可能需要经典除法,因此除了测试之外,我不建议这样做。但为了演示:
$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
解决方案 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
解决方案 7:
添加点(.
)表示浮点数
>>> 4/3.
1.3333333333333333
解决方案 8:
这也行得通
>>> u=1./5
>>> print u
0.2
解决方案 9:
如果您想默认使用“真”(浮点)除法,则有一个命令行标志:
python -Q new foo.py
有一些缺点(来自 PEP):
有人认为,更改默认设置的命令行选项是邪恶的。如果使用不当,它肯定会很危险:例如,无法将需要 -Qnew 的第三方库包与需要 -Qold 的另一个库包合并。
您可以通过查看 python 手册页了解有关改变/警告除法行为的其他标志值的更多信息。
有关除法变化的完整详细信息,请阅读:PEP 238——更改除法运算符
解决方案 10:
from operator import truediv
c = truediv(a, b)
解决方案 11:
from operator import truediv
c = truediv(a, b)
其中 a 为被除数,b 为除数。当两个整数相除后的商为浮点数时,此函数非常方便。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件