我试图将一组数字从-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.在我看来,它不是透明的,但我猜它就是这样。
解释是什么?
答案 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
包裹可能会失去一点可读性。