Integer division & modulo operation with negative operands in Python
当我在Python 3.3.0中输入这些表达式时会出现问题
1 2 3 4 5 | -10 // 3 # -4 -10 % 3 # 2 10 // -3 # -4 10 % -3 # -2 -10 // -3 # 3 |
它似乎需要近似浮点(-3.33)? 并且在整数除法中向下舍入,但在模运算中它做了完全不同的事情。 看起来它返回余数+/- 1并且仅根据负操作数的位置切换符号。 即使在查看本网站上的其他答案之后,我也完全感到困惑! 我希望有人能够清楚地解释这个我! 这本书提示:回想一下这个神奇的公式a =(a // b)(b)+(a%b),但这似乎根本不能为我清除水。
-提前致谢!
编辑:这些只是我对发生的事情的个人评估(上图),我知道,我完全不在了!
-
魔术公式:
a = (a // b) * b + (a % b) -
a: -10 -
b: 3 -
a // b: -4 -
a % b: 2 用魔法公式代替:
-10 = -4 * 3 + 2 = -12 + 2 = -10 -
<5233>
-
b: -3 -
a // b: -4 -
a % b: -2 在神奇的公式中:
10 = -4 * -3 - 2 = 12 - 2 = 10
所以神奇的公式似乎是正确的。
如果将
-
a: -10 -
b: 3 -
a % b = a - floor(a / b) * b = -10 - floor(-3.33) * 3 = -10 + 4 * 3 = 2
&NBSP;
1 2 3 4 5 6 7 | b = 3: 0 1 2 3 4 5 6 7 8 9 10 11 ... |
如果
1 2 3 4 5 6 | a a % b _______________ 0 1 2 0 1 2 3 4 5 0 1 2 6 7 8 0 1 2 9 10 11 0 1 2 |
现在将表扩展回负面:
1 2 3 4 5 6 7 8 9 10 | a a % b __________________ -12 -11 -10 0 1 2 -9 -8 -7 0 1 2 -6 -5 -4 0 1 2 -3 -2 -1 0 1 2 0 1 2 0 1 2 3 4 5 0 1 2 6 7 8 0 1 2 9 10 11 0 1 2 |
整数除法只是在最后得到的数字的最低点。
1 2 | 10/3 -> floor(3.33) -> 3 -10/3 -> floor(-3.33) -> -4 |
(为什么是地板)
另一方面,模运算遵循数学定义。
一个简单的规则:对于
并应用神奇的公式:
好的,所以我做了一些挖掘,我认为问题不是Python,而是Modulo函数。我的答案基于http://mathforum.org/library/drmath/view/52343.html
10%3使用3的最高倍数,小于10.在这种情况下,9。10 - 9 = 1
-10%3做同样的事情。它仍然在寻找不到10的倍数。在这种情况下,-12。 (-10) - (-12)= 2