我如何强制划分为浮点?分部继续向下舍入到0?

Nat*_*man 703 python floating-point integer division python-2.x

我有两个整数值ab,但我需要他们的浮点比例.我知道a < b并且我想要计算a / b,所以如果我使用整数除法,我将总是得到0,余数为a.

我如何c在Python中强制成为Python中的浮点数?

c = a / b
Run Code Online (Sandbox Code Playgroud)

Mic*_*ley 788

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663
Run Code Online (Sandbox Code Playgroud)

  • 如果你走这条路并且仍然需要一些整数除法,你可以像“a // b”那样做 (91认同)
  • 请注意,在 Python 3 中,这是默认行为。 (34认同)
  • 请注意,`from __future__ import division`必须位于文件的最开头 (11认同)
  • 这也是 Idle (ipython) shell 中的默认行为,但不是 ipython 脚本解释器中的默认行为,这在调试由默认系统 python 解释器运行的脚本时确实会引起麻烦。 (7认同)
  • @mercury0114:没问题;当你想要地板分割时,你只需使用`//`,当你想要“true”(`float`)分割时,你只需使用`/`。 (5认同)
  • 但这并不会改变operator.div的行为。为此,请使用operator.truediv()。 (4认同)
  • @xxSithRagexx Python 2 遵循其他语言的通用约定,特别是 C - int 除以 int 产生 int 结果。在 Python 3 中,他们意识到这不直观并进行了更改。 (2认同)

Ste*_*out 710

你可以通过这样做来施展c = a / float(b).如果分子或分母是浮点数,那么结果也是.


需要注意的是:正如评论者指出的那样,如果b可能是整数或浮点数(或表示一个字符串的字符串)以外的其他内容,则无效.如果您可能正在处理其他类型(例如复数),则需要检查这些类型或使用其他方法.

  • 这*不是*比使用“__future__”更好的答案。当转换为“float”时,“b”可能会丢失信息!正确的解决方法是将其他被乘数乘以“1.0”。 (9认同)
  • 例如,如果强制转换的参数已经不是“float”或“int”,它将失败。[PEP 238](https://www.python.org/dev/peps/pep-0238/) 中详细讨论了正确的方法。 (2认同)

Aar*_*all 189

如何在Python中强制除法成为浮点?

我有两个整数值a和b,但我需要它们的浮点比率.我知道a <b我想计算a/b,所以如果我使用整数除法,我将总是得到0,余数为a.

我怎样才能在下面强制c成为Python中的浮点数?

c = a / b
Run Code Online (Sandbox Code Playgroud)

这里真正要问的是:

"我如何强制真正的分裂,以便a / b返回一小部分?"

升级到Python 3

在Python 3中,为了得到真正的除法,你就是这么做的a / b.

>>> 1/2
0.5
Run Code Online (Sandbox Code Playgroud)

Floor division,整数的经典除法行为,现在是a // b:

>>> 1//2
0
>>> 1//2.0
0.0
Run Code Online (Sandbox Code Playgroud)

但是,您可能会遇到使用Python 2的问题,或者您可能正在编写必须同时适用于2和3的代码.

如果使用Python 2

在Python 2中,它并不那么简单.处理经典Python 2分区的一些方法比其他方法更好,更健壮.

Python 2的推荐

您可以在任何给定模块中获得Python 3除法行为,顶部有以下导入:

from __future__ import division
Run Code Online (Sandbox Code Playgroud)

然后将Python 3样式分区应用于整个模块.它也适用于任何给定点的python shell.在Python 2中:

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0
Run Code Online (Sandbox Code Playgroud)

这确实是最好的解决方案,因为它可以确保模块中的代码与Python 3更加向前兼容.

Python的其他选项2

如果您不想将其应用于整个模块,则仅限于一些解决方法.最受欢迎的是将其中一个操作数强制转换为浮点数.一个强大的解决方案a / (b * 1.0).在一个新的Python shell中:

>>> 1/(2 * 1.0)
0.5
Run Code Online (Sandbox Code Playgroud)

同样强大的是truediv来自operator模块operator.truediv(a, b),但这可能更慢,因为它是一个函数调用:

>>> from operator import truediv
>>> truediv(1, 2)
0.5
Run Code Online (Sandbox Code Playgroud)

不推荐用于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
Run Code Online (Sandbox Code Playgroud)

故意让你的代码变得更脆弱对我来说没有多大意义.

您也可以使用-Qnew标志运行Python ,但是这具有使用新的Python 3行为执行所有模块的缺点,并且您的一些模块可能期望经典除法,因此除了测试之外我不建议这样做.但要证明:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j
Run Code Online (Sandbox Code Playgroud)

  • “ 1 // 2 = 0”,“ 1 // 2.0 = 0.0”-有趣的小陷阱,即使它是整数除法,如果任何操作数都是浮点数,那么结果是整数,而且也是浮点数。我正在使用整数除法来计算列表索引,因此出现错误。 (3认同)

new*_*cct 66

在Python 3.x中,单斜杠(/)总是表示真(非截断)除法.(该//运算符用于截断除法.)在Python 2.x(2.2及更高版本)中,您可以通过放置一个

from __future__ import division
Run Code Online (Sandbox Code Playgroud)

在您的模块的顶部.


gsb*_*bil 30

只使用浮点格式进行除法的任何参数也会产生浮点输出.

例:

>>> 4.0/3
1.3333333333333333
Run Code Online (Sandbox Code Playgroud)

要么,

>>> 4 / 3.0
1.3333333333333333
Run Code Online (Sandbox Code Playgroud)

要么,

>>> 4 / float(3)
1.3333333333333333
Run Code Online (Sandbox Code Playgroud)

要么,

>>> float(4) / 3
1.3333333333333333
Run Code Online (Sandbox Code Playgroud)

  • 但是你可能以后会想要做"1.0 + 1/3"或"浮动(c)+ a/b"或"浮动(a/b)",你会对答案感到失望.最好使用python 3+或导入`__future __.division`模块,(参见接受的答案),总能得到你期望的答案.现有的划分规则会产生阴险,难以追踪的数学错误. (4认同)

Ale*_*der 20

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

>>> 4/3.
1.3333333333333333
Run Code Online (Sandbox Code Playgroud)

要么

>>> 4/3.
1.3333333333333333
Run Code Online (Sandbox Code Playgroud)

  • 如果分子和分母都是变量,您将如何应用这种方法? (2认同)

Gau*_*wal 12

这也行

>>> u=1./5
>>> print u
0.2
Run Code Online (Sandbox Code Playgroud)

0.2

  • 如果分子和分母都是变量,你将如何应用这种方法? (3认同)

ste*_*bez 6

如果要在默认情况下使用"true"(浮点)除法,则有一个命令行标志:

python -Q new foo.py
Run Code Online (Sandbox Code Playgroud)

有一些缺点(来自PEP):

有人认为,更改默认值的命令行选项是邪恶的.在错误的人手中肯定是危险的:例如,将第三方库包需要-Qnew和另一个需要-Qold的库组合在一起是不可能的.

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

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