模数为Python中的负红利

can*_*289 6 python modulo

正在查看其他答案,我仍然不理解python中负数的模数

例如df的回答

x == (x/y)*y + (x%y)
Run Code Online (Sandbox Code Playgroud)

所以有意义的是(-2)%5 = -2 - (-2/5)*5 = 3

这不是(-2 - (-2/5)*5)= 0还是我只是疯了? 具有负值的模数运算 - 奇怪的是什么?

python中的这个负数模数相同 他从哪里得到-2?

最后,如果该标志取决于股息,为什么负股息与正面股票的产出不相同?

例如,输出

print([8%5,-8%5,4%5,-4%5])
Run Code Online (Sandbox Code Playgroud)

[3, 2, 4, 1]
Run Code Online (Sandbox Code Playgroud)

Tay*_*mon 12

在Python中,modulo是根据两个规则计算的:

  • (a // b) * b + (a % b) == a,和
  • a % b与...有相同的标志b.

将此与整数除法向下舍入(朝向-∞)的事实相结合,并解释所得到的行为.

如果你这样做-8 // 5,你得到-1.6向下舍入,即-2.乘以5,你得到-10; 2是你必须添加到的数字才能获得-8.因此,-8 % 5是2.


dan*_*n04 6

在Python中,a // b定义为floor(a/b),而不是大多数其他语言,其中整数除法定义为trunc(a/b).a % b= 的解释存在相应的差异a - (a // b) * b.

这样做的原因是Python对%运算符(和divmod)的定义通常比其他语言更有用.例如:

def time_of_day(seconds_since_epoch):
    minutes, seconds = divmod(seconds_since_epoch, 60)
    hours, minutes = divmod(minutes, 60)
    days, hours = divmod(hours, 24)
    return '%02d:%02d:%02d' % (hours, minutes, seconds)
Run Code Online (Sandbox Code Playgroud)

使用此功能,time_of_day(12345)返回'03:25:45',如您所料.

但是这个时代之前的12345秒几点了?用Python的定义divmod,time_of_day(-12345)正确返回'20:34:15'.

如果我们重新定义divmod使用的C定义的/%

def divmod(a, b):
    q = int(a / b)   # I'm using 3.x
    r = a - b * q
    return (q, r)
Run Code Online (Sandbox Code Playgroud)

现在,time_of_day(-12345)退货'-3:-25:-45',这不是一天中的有效时间.如果以divmod这种方式实现标准Python 函数,则必须编写特殊情况代码来处理负输入.但是,就像我的第一个例子一样,有了地板式的划分,它就是Just Works.

  • 我只使用了一点点Python,并没有给它留下深刻的印象,但是看到至少有一种编程语言支持一个可用的除法运算符让我感到温暖.你的时间例子很棒.我看到有人抱怨欧几里德模数算子无法从负数中提取数字(例如-123%10,即使最后一位数为3,也会产生7).另一方面,产生-3的C风格余数运算符实际上并没有更好. (2认同)