Python中负红利的模

2024-05-23 16:14:44 发布

您现在位置:Python中文网/ 问答频道 /正文

一直在寻找其他答案,但我仍然不明白python中负数的模

例如df的答案

x == (x/y)*y + (x%y)

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

这是不是(-2-(-2/5)*5)=0,还是我疯了? Modulus operation with negatives values - weird thing?

跟这个一样 negative numbers modulo in python 他从哪里得到-2?

最后,如果符号依赖于股利,为什么负股利的产出不与正股利的产出相同?

例如

print([8%5,-8%5,4%5,-4%5])

[3, 2, 4, 1]

Tags: 答案dfwithoperation意义valuesthingnumbers
3条回答

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

  • (a // b) * b + (a % b) == a,和
  • a % bb具有相同的符号。

结合整数除法向下舍入(朝向&∞)的事实,解释了产生的行为。

如果你做-8 // 5,你会得到-1.6,也就是-2。把它乘以5得到-10;2是你要加上去得到-8的数字。因此,-8 % 5是2。

这背后的基本原理实际上是least residue的数学定义。Python尊重这个定义,而在大多数其他编程语言中,模运算符实际上更像是“除法后的reaminder”运算符。要计算-5 % 11的最小余数,只需将11添加到-5,直到获得范围[0,10]内的正整数,结果是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)

使用此函数,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)

现在,time_of_day(-12345)返回'-3:-25:-45',这不是一天中的有效时间。如果标准Python divmod函数是这样实现的,那么您必须编写特殊的case代码来处理负输入。但对于地板风格的划分,就像我的第一个例子,它只是工作。

相关问题 更多 >