如何强制将除法转换为浮点数?除法总是向下舍入为 0?

2024-11-20 08:44:00
admin
原创
192
摘要:问题描述:我有两个整数值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 为除数。当两个整数相除后的商为浮点数时,此函数非常方便。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用