为什么除法结果会舍入为整数?
我在尝试把一组从-100到0的数字转换到10到100的范围时遇到了问题。后来我发现,即使没有任何变量,这个计算的结果也和我预想的不一样:
>>> (20-10) / (100-10)
0
浮点数的除法也不管用:
>>> float((20-10) / (100-10))
0.0
如果把除法的任意一边转换成浮点数,计算就能正常进行:
>>> (20-10) / float((100-10))
0.1111111111111111
在第一个例子中,除法两边的数都是整数,这就意味着最后的结果也会被当作整数处理。因为0.111小于0.5,所以它会被四舍五入成0。我觉得这不太直观,但这就是事实。
这是什么原因呢?
13 个回答
在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,这就是因为/
是浮点数除法的原因。
你在使用整数,所以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
你正在使用 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