137

我试图将一组数字从 -100 规范化到 0 到 10-100 的范围,并且遇到问题只是注意到即使根本没有变量,这也不能评估我期望的方式:

>>> (20-10) / (100-10)
0

浮点除法也不起作用:

>>> float((20-10) / (100-10))
0.0

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

>>> (20-10) / float((100-10))
0.1111111111111111

第一个例子中的每一边都被评估为一个 int,这意味着最终的答案将被转换为一个 int。由于 0.111 小于 0.5,因此舍入为 0。在我看来它并不透明,但我想就是这样。

解释是什么?

4

12 回答 12

247

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

>>> 1 / 2
0

您应该将其中一个设为float

>>> float(10 - 20) / (100 - 10)
-0.1111111111111111

from __future__ import division,这迫使/采用 Python 3.x 的行为,该行为总是返回一个浮点数。

>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111
于 2010-06-02T14:36:53.837 回答
21

将 Integers 放入其中,因此 Python 会返回一个整数

>>> 10 / 90
0

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

如果您在除法的任一侧使用浮点数,那么 Python 将为您提供您期望的答案。

>>> 10 / 90.0
0.1111111111111111

所以在你的情况下:

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
于 2010-06-02T14:35:57.723 回答
11

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

float(20 - 10) / (100 - 10)
于 2010-06-02T14:35:14.150 回答
11

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

>>>20/15
1

>>>20.0/15.0
1.33333333333

>>>20.0/15
1.33333333333

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

>>> 20/15
1.33333333333

>>>20.0/15
1.33333333333

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

//运算符在 Python 2.7 和 Python 3.3 中都是整数除法运算符。

在 Python 2.7 和 Python 3.3 中:

>>>20//15
1

现在看看对比

>>>a = 7.0/4.0
>>>b = 7/4
>>>print a == b

对于上述程序,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,只是因为/是浮点除法。

于 2015-08-02T09:49:51.413 回答
8

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

示例:由于这是一个在我进行算术运算时总是在我脑海中浮现的问题(我应该转换为浮点数以及哪个数字),因此提供了一个来自该方面的示例:

>>> a = 1/2/3/4/5/4/3
>>> a
0

当我们除以整数时,不足为奇的是它会变得更低四舍五入。

>>> a = 1/2/3/4/5/4/float(3)
>>> a
0.0

如果我们将最后一个整数类型转换为浮点数,我们仍然会得到零,因为当我们的数字除以浮点数时,由于整数除法,我们已经变成了 0。

>>> a = 1/2/3/float(4)/5/4/3
>>> a
0.0

与上面相同的场景,但将浮点类型转换移动到更靠近左侧的位置。

>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445

最后,当我们将第一个整数类型转换为浮点数时,结果就是所需的整数,因为从第一个除法开始,即最左边的除法,我们使用浮点数。

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

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

>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0
于 2014-11-20T22:52:31.633 回答
4

Specifying a float by placing a '.' after the number will also cause it to default to float.

>>> 1 / 2
0

>>> 1. / 2.
0.5
于 2014-08-22T16:41:12.463 回答
2

使其中至少一个浮动,那么它将是浮动除法,而不是整数:

>>> (20.0-10) / (100-10)
0.1111111111111111

将结果转换为浮动为时已晚。

于 2010-06-02T14:37:11.813 回答
1

在 pythoncv2中没有更新除法计算。所以,你必须包含from __future__ import division 在程序的第一行。

于 2018-06-30T11:23:55.367 回答
0

无论哪种方式,它都是整数除法。10/90 = 0。在第二种情况下,您只是将 0 转换为浮点数。

尝试将“/”的操作数之一转换为浮点数:

float(20-10) / (100-10)
于 2010-06-02T14:35:39.860 回答
0

在您的第二个示例中已经发生除法之后,您正在浮动。尝试这个:

float(20-10) / float(100-10)
于 2010-06-02T14:35:46.380 回答
0

我有点惊讶,没有人提到原始海报可能喜欢有理数的结果。如果您对此感兴趣,基于 Python 的程序Sage 将为您提供支持。(目前仍然基于 Python 2.x,尽管 3.x 正在进行中。)

sage: (20-10) / (100-10)
1/9

这不是每个人的解决方案,因为它确实做了一些准备,所以这些数字不是ints,而是 SageInteger类元素。尽管如此,作为 Python 生态系统的一部分,还是值得一提的。

于 2017-02-22T03:10:16.287 回答
0

1. *我个人更喜欢在开头插入 a 。所以表达式变成了这样:

1. * (20-10) / (100-10)

因为我总是对一些公式进行除法,例如:

accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)

所以不可能简单地添加一个.0like 20.0。就我而言,用 a 包装float()可能会失去一点可读性。

于 2017-10-08T14:31:39.490 回答