当我在Python 3.3.0中输入这些表达式时会出现问题
-10 // 3 # -4
-10 % 3 # 2
10 // -3 # -4
10 % -3 # -2
-10 // -3 # 3
好像它需要近似浮点(-3.33)?并且在整数除法中向下舍入,但在模运算中它做了完全不同的事情。看起来它返回余数+/- 1并且仅根据负操作数的位置切换符号。即使在查看本网站上的其他答案之后,我也完全感到困惑!我希望有人能够清楚地解释这个我!这本书提示:回想一下这个神奇的公式a =(a // b)(b)+(a%b),但这似乎根本不能为我清除水。
- 提前谢谢!
编辑:这些只是我个人对上面发生的事情的评估(上图),我知道,我已经完全离开了!
答案 0 :(得分:5)
a = (a // b) * b + (a % b)
a: -10
b: 3
a // b: -4
a % b: 2
用魔术公式代替:-10 = -4 * 3 + 2 = -12 + 2 = -10
a: 10
b: -3
a // b: -4
a % b: -2
在魔术公式中:10 = -4 * -3 - 2 = 12 - 2 = 10
所以神奇的公式似乎是正确的。
如果您将a // b
定义为floor(a / b)
(它是),则a % b
应为a - floor(a / b) * b
。我们来看看:
a: -10
b: 3
a % b = a - floor(a / b) * b = -10 - floor(-3.33) * 3 = -10 + 4 * 3 = 2
a // b
总是很容易被记住的事实(请阅读Cthulhu的第一个链接,这是Python创建者的解释)。对于a
中的否定a % b
,请尝试设想一个从0
开始且有b
列的数字表:
b = 3:
0 1 2
3 4 5
6 7 8
9 10 11
...
如果a
是单元格中的数字,则a % b
将是列号:
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
现在将表格延伸到底片中:
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
-10 % 3
将是2
。 a
中的否定a % b
会出现在这些背景中。带有a % b
的{{1}} b
不会出现太多。
答案 1 :(得分:3)
整数除法只是在最后得到的数字的底线。
10/3 -> floor(3.33) -> 3
-10/3 -> floor(-3.33) -> -4
<强> (Why it floors) 强>
另一方面,模数操作遵循 mathematical definition 。
答案 2 :(得分:2)
a % b = c
的{p> A simple rule:,如果c
不为零,则应与b
具有相同的符号。
并运用神奇的公式:
10 % -3 = -2
=&gt; 10 // -3 = (10 - (-2)) / (-3) = -4
-10 % 3 = 2
=&gt; -10 // 3 = (-10 - 2) / 3 = -4
-10 % -3 = -1
=&gt; -10 // -3 = (-10 - (-1)) / (-3) = 3
答案 3 :(得分:1)
好的,所以我做了一些挖掘,我认为问题不是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