Python余数运算符

时间:2013-08-28 22:40:23

标签: python

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

-5 mod 2 = 1

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

我必须自己实施吗?)?

3 个答案:

答案 0 :(得分:19)

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

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

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

几乎每种语言都只提供三种语言中的一种(Fortran是一个值得注意的例外)。*大多数语言都提供与语言的除法运算符相匹配的语言。**因为Python使用了floored划分(遵循 The Art中的Knuth的论点)计算机编程),它使用匹配的余数运算符。

如果你想要另一个,你必须手动编写。这不是很难; this Wikipedia article显示了如何实现这三种方法。

例如:

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调用覆盖余数modulo,而Scheme调用欧几里德余数mod

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

答案 1 :(得分: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)

答案 2 :(得分:-1)

math.fmod能做你想要的吗?