Python余数运算符

Dej*_*jwi 8 python

Python中是否有任何余数运算符?我不要求模运算符,但余数.例如:

-5 mod 2 = 1
Run Code Online (Sandbox Code Playgroud)

-5 rem 2 = -1 # where "rem" is a remainder operator.
Run Code Online (Sandbox Code Playgroud)

我是否必须自己实施;)?

aba*_*ert 21

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

  • 截断除法余数:符号与被除数相同.
  • 地板除法余数:符号与除数相同.
  • 欧几里德分裂余数:符号总是正的.

称其中一个"模数"和另一个"剩余"是非常令人困惑的; 所有这三个都是这两个术语的有用定义.

几乎每种语言都只提供三种语言中的一种(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
Run Code Online (Sandbox Code Playgroud)

现在,举个例子:

>>> q, r = trunc_divmod(-5, 2)
>>> print(q, r)
-2 -1
Run Code Online (Sandbox Code Playgroud)

*通常语言提供两个调用截断的余数的一些变化mod,并在rem... 上的一些变化,但绝对不是可依赖的东西.例如,Fortran调用floored余数modulo,而Scheme调用Euclidean余数mod.

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


shu*_*e87 1

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

如果符号始终为正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)
Run Code Online (Sandbox Code Playgroud)

  • 不,“divmod(a, b)”返回与“(a/b, a%b)”完全相同的结果。换句话说,OP仍然会得到“1”而不是他想要的“-1”。 (2认同)