如何强制将除法转换为浮点数?除法总是向下舍入为 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 中,行为是相反的;请参阅为什么整数除法会产生浮点数而不是另一...

问题描述:

我有两个整数值ab,但我需要它们的浮点数比率。我知道这一点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 为除数。当两个整数相除后的商为浮点数时,此函数非常方便。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用