为什么除法结果会舍入为整数?

138 投票
13 回答
438716 浏览
提问于 2025-04-15 23:27

我在尝试把一组从-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 个回答

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,这就是因为/是浮点数除法的原因。

21

你在使用整数,所以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
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

撰写回答