Python部门

Ada*_*son 129 python math python-2.x

我试图将一组数字从-100标准化为0到10-100的范围,并且只是注意到即使没有变量,也没有评估我期望它的方式:

>>> (20-10) / (100-10)
0
Run Code Online (Sandbox Code Playgroud)

浮动部门也不起作用:

>>> float((20-10) / (100-10))
0.0
Run Code Online (Sandbox Code Playgroud)

如果除法的任何一方被强制转换为浮点数,它将起作用:

>>> (20-10) / float((100-10))
0.1111111111111111
Run Code Online (Sandbox Code Playgroud)

第一个示例中的每一侧都评估为int,这意味着最终答案将被转换为int.因为0.111小于.5,所以它会变为0.在我看来,这不是透明的,但我想这就是它的方式.

解释是什么?

ken*_*ytm 242

您正在使用Python 2.x,其中整数除法将截断而不是成为浮点数.

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

你应该让他们中的一个float:

>>> float(10 - 20) / (100 - 10)
-0.1111111111111111
Run Code Online (Sandbox Code Playgroud)

或者from __future__ import division,/采用Python 3.x总是返回浮点数的行为的力量.

>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
Run Code Online (Sandbox Code Playgroud)

  • 如果使用`from __future__ import division`,你可以使用两个斜杠来获得旧的C风格的除法行为(例如`1 // 2`将导致0).参见[Pep 238更改分部操作员](http://www.python.org/dev/peps/pep-0238/) (10认同)

Dav*_*ebb 20

你正在使用Integers,所以Python给你一个整数:

>>> 10 / 90
0
Run Code Online (Sandbox Code Playgroud)

如果你之后将它转换为浮点数,则舍入将已经完成,换句话说,0整数将始终变为0浮点数.

如果您在分区的任何一侧使用浮动,那么Python将为您提供您期望的答案.

>>> 10 / 90.0
0.1111111111111111
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下:

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
Run Code Online (Sandbox Code Playgroud)


A. *_*evy 11

在进行除法之前,您需要将其更改为浮点数.那是:

float(20 - 10) / (100 - 10)
Run Code Online (Sandbox Code Playgroud)

  • @Adam:首先是哪一方并不重要. (10认同)
  • @Adam Nelson:对我来说正常.检查你的括号. (4认同)

Har*_*han 11

在Python 2.7中,/如果输入是整数,则运算符是整数除法:

>>>20/15
1

>>>20.0/15.0
1.33333333333

>>>20.0/15
1.33333333333
Run Code Online (Sandbox Code Playgroud)

在Python 3.3中,/即使输入是整数,运算符也是浮点除法.

>>> 20/15
1.33333333333

>>>20.0/15
1.33333333333
Run Code Online (Sandbox Code Playgroud)

对于Python 3中的整数除法,我们将使用//运算符.

//操作者在两个Python 2.7版和Python 3.3的整数除法运算符.

在Python 2.7和Python 3.3中:

>>>20//15
1
Run Code Online (Sandbox Code Playgroud)

现在,看看比较

>>>a = 7.0/4.0
>>>b = 7/4
>>>print a == b
Run Code Online (Sandbox Code Playgroud)

对于上面的程序,Python 2.7中的输出为False,Python 3.3中的输出为True.

在Python 2.7中,a = 1.75,b = 1.

在Python 3.3 a = 1.75和b = 1.75中,只是因为/是浮点除法.


Geo*_*rge 8

它与你使用的python版本有关.基本上它采用C行为:如果你划分两个整数,结果将向下舍入为整数.还要记住,Python从左到右执行操作,这在您进行类型转换时起作用.

示例:由于这是一个在我进行算术运算时总会出现在我头脑中的问题(我应该转换为float和哪个数字),这个方面的例子如下:

>>> a = 1/2/3/4/5/4/3
>>> a
0
Run Code Online (Sandbox Code Playgroud)

当我们划分整数时,毫不奇怪它会降低整数.

>>> a = 1/2/3/4/5/4/float(3)
>>> a
0.0
Run Code Online (Sandbox Code Playgroud)

如果我们将最后一个整数强制转换为float,那么我们仍然会得到零,因为当我们的数字除以浮点时,由于整数除法,它已经变为0.

>>> a = 1/2/3/float(4)/5/4/3
>>> a
0.0
Run Code Online (Sandbox Code Playgroud)

与上面相同的情况,但将浮动类型转移到更接近左侧.

>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445
Run Code Online (Sandbox Code Playgroud)

最后,当我们将第一个整数强制转换为float时,结果是所需的整数,因为从第一个分区开始,即最左边的整数,我们使用浮点数.

额外1:如果您试图回答这个问题以改进算术评估,您应该检查一下

额外2:请注意以下情况:

>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0
Run Code Online (Sandbox Code Playgroud)