Python中是否有任何余数运算符?我不要求模运算符,但余数。例如:
-5 mod 2 = 1
但
-5 rem 2 = -1 # where "rem" is a remainder operator.
我必须自己实施吗?)?
答案 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
能做你想要的吗?