9

Python中有余数运算符吗?我不要求取模运算符,而是要求余数。例如:

-5 mod 2 = 1

-5 rem 2 = -1 # where "rem" is a remainder operator.

我是否必须自己实现它;)?

4

3 回答 3

22

“模”或“余数”实际上有三种不同的定义,而不是两种:

  • 截断除法余数:符号与被除数相同。
  • Floored 除法余数:符号与除数相同。
  • 欧几里得除法余数:符号始终为正。

称其中一个为“模”而另一个为“余数”是非常令人困惑的;这三个都是对这两个术语有用的定义。

几乎每一种语言都只提供这三种中的一种(Fortran 是一个明显的例外)。* 大多数语言都提供与该语言的除法运算符匹配的一种。** 因为 Python 使用底除法(遵循 Knuth 在《计算机编程艺术》中的论点),所以它使用匹配的余数运算符。

如果您想要其中任何一个,则必须手动编写。这不是很难;这篇维基百科文章展示了如何实现这三个。

例如:

def trunc_divmod(a, b):
    q = a / b
    q = -int(-q) if q<0 else int(q)
    r = a - b * q
    return q, r

现在,对于您的示例:

>>> q, r = trunc_divmod(-5, 2)
>>> print(q, r)
-2 -1

mod* 通常,同时提供调用截断余数的语言rem会在 . 例如,Fortran 调用 floored 余数modulo,而 Scheme 调用 Euclidean 余数mod

** 两个值得注意的例外是 C90 和 C++03,它们将选择权留给实现。虽然许多实现使用截断除法和余数,但有些不使用(一些甚至使用截断除法和取整余数,这意味着a = b * (a/b) + a%b甚至不起作用……)。

于 2013-08-28T22:53:47.057 回答
2

编辑:当您要求进行余数运算时,您的意思并不完全清楚,执行此操作的方法将取决于对输出符号的要求。

如果标志总是积极的divmod可以做你想做的,它在标准库中

http://docs.python.org/2/library/functions.html#divmod

您还可能想查看内置的二进制算术运算符:

http://docs.python.org/2/reference/expressions.html

如果余数必须与传递的参数具有相同的符号,那么您必须自己滚动,例如:

import math
def rem(x,y):
    res = x % y
    return math.copysign(res,x)
于 2013-08-28T22:42:42.397 回答
0

math.fmod你想要的吗?

于 2013-08-28T23:03:54.400 回答