Python部门

时间:2010-06-02 14:33:00

标签: python math python-2.x

我试图将一组数字从-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小于.5,所以它会变为0.在我看来,它不是透明的,但我猜它就是这样。

解释是什么?

12 个答案:

答案 0 :(得分:237)

您正在使用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

答案 1 :(得分:19)

你是putting Integers in so Python is giving you an integer back

>>> 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

答案 2 :(得分:11)

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

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

答案 3 :(得分:9)

在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中,只是因为/是一个浮点除法。

答案 4 :(得分:8)

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

实施例: 因为这是一个在我进行算术运算时总是会出现在我头脑中的问题(我应该转换为float和哪个数字),这个例子就是这样的例子:

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

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

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

如果我们将最后一个整数强制转换为float,我们仍然会得到零,因为当我们的数字除以浮点数时,由于整数除法,它已经变为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

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

额外1:如果您尝试回答这个问题以改进算术评估,则应检查this

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

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

答案 5 :(得分:4)

通过放置'指定浮动。'数字后也会导致它默认为浮动。

>>> 1 / 2
0

>>> 1. / 2.
0.5

答案 6 :(得分:2)

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

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

将结果转换为浮动太晚了。

答案 7 :(得分:1)

在python cv2中未更新除法计算。因此,您必须在程序的第一行中包含from __future__ import division

答案 8 :(得分:0)

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

尝试将其中一个操作数“/”转换为浮点数:

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

答案 9 :(得分:0)

在你的第二个例子中已经发生了分裂之后,你正在进行浮动。试试这个:

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

答案 10 :(得分:0)

我有点惊讶,没有人提到原版海报可能会喜欢理性数字。如果您对此感兴趣,请使用基于Python的程序Sage has your back。 (目前仍然基于Python 2.x,虽然3.x正在进行中。)

 public static void main(String args[]) {
 Scanner scan = new Scanner(System.in);

 String speedLimit;
 int c = 0;
 while(scan.hasNext()){
    if (scan.next().equals("hey")){    
         c++;
    }
 }

 System.out.println(c);

}

这对每个人来说都不是一个解决方案,因为它确实做了一些预先准备,所以这些数字不是sage: (20-10) / (100-10) 1/9 ,而是Sage int类元素。值得一提的是,作为Python生态系统的一部分。

答案 11 :(得分:0)

就个人而言,我倾向于在一开始就插入1. * (20-10) / (100-10) 。所以表达式就像这样:

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

因为我总是对某些公式进行划分:

.0

因此无法简单地添加20.0 float()。在我的情况下,用UIPicker包裹可能会失去一点可读性。