Python中有余数运算符吗?我不要求取模运算符,而是要求余数。例如:
-5 mod 2 = 1
但
-5 rem 2 = -1 # where "rem" is a remainder operator.
我是否必须自己实现它;)?
Python中有余数运算符吗?我不要求取模运算符,而是要求余数。例如:
-5 mod 2 = 1
但
-5 rem 2 = -1 # where "rem" is a remainder operator.
我是否必须自己实现它;)?
“模”或“余数”实际上有三种不同的定义,而不是两种:
称其中一个为“模”而另一个为“余数”是非常令人困惑的;这三个都是对这两个术语有用的定义。
几乎每一种语言都只提供这三种中的一种(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
甚至不起作用……)。
编辑:当您要求进行余数运算时,您的意思并不完全清楚,执行此操作的方法将取决于对输出符号的要求。
如果标志总是积极的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)
做math.fmod
你想要的吗?