为什么除法四舍五入为整数?

新手上路,请多包涵

我试图将一组从 -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。在我看来这不是透明的,但我想事情就是这样。

解释是什么?

原文由 Adam Nelson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 518
2 个回答

您使用的是 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

原文由 kennytm 发布,翻译遵循 CC BY-SA 2.5 许可协议

把整数放进去,所以 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

原文由 David Webb 发布,翻译遵循 CC BY-SA 2.5 许可协议

推荐问题