9

当我在 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) 但这似乎并没有为我清除水。

-提前致谢!

编辑:这些只是我对发生的事情的个人评估(上图),我知道,我完全离开了!

4

4 回答 4

7

那里的整数除法只占最后获得的数字的底数。

10/3  -> floor(3.33)  ->  3
-10/3 -> floor(-3.33) -> -4

(为什么它地板)


另一方面,模运算遵循数学定义

于 2013-01-15T22:43:47.633 回答
6
  • 魔法公式: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 // bfloor(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。否定aina % b会出现在这种情况下。a % b负数b不会出现太多。

于 2013-01-15T22:45:34.290 回答
2

一个简单的规则:对于a % b = c,如果c不为零,则应该与 具有相同的符号b

并应用神奇的公式:

10 % -3 = -2=>10 // -3 = (10 - (-2)) / (-3) = -4

-10 % 3 = 2=>-10 // 3 = (-10 - 2) / 3 = -4

-10 % -3 = -1=>-10 // -3 = (-10 - (-1)) / (-3) = 3

于 2013-01-15T23:06:52.873 回答
1

好的,所以我做了一些挖掘,我认为问题不在于 Python,而在于 Modulo 函数。我的答案基于http://mathforum.org/library/drmath/view/52343.html

10 % 3 使用小于 10 的 3 的最大倍数。在这种情况下,9. 10 - 9 = 1

-10 % 3 做同样的事情。它仍在寻找小于 -10 的 3 的倍数。在这种情况下,-12。(-10) - (-12) = 2

于 2013-01-15T22:49:27.560 回答