负数如何求模,正数对负数取模定律,负数的取模
学Python看这部分数值运算和模运算。原来不仅正数和负数可以取模,浮点数甚至复数都可以取模:
对于x%y,
如果都是整数,则返回x/y的余数;
如果是浮点数,则返回x-int(x/y)* y;
如果是复数,x-int((x/y))。实数)*y返回。
然而,这些公式似乎只有当操作数都是正数时才满足。
对于负数参与模运算,不同的语言有不同的规定:
C/Java语言中的除法采用零截断。一个规则是模运算结果的符号与第一个操作数的符号相同(或为0)。
C截断的方式取决于具体的机器。
Python语言划分采用负无限截断,即地板划分。是的,模运算结果的符号与第二个操作数的符号相同。
综上所述,可以总结如下:
在C和Java中,模运算只能是整数。先不管正负计算结果,然后加上符号,使结果与第一个操作数符号相同。
在Python中,模运算也可以是浮点数和复数;
对于两个操作数符号相同的情况,直接取余数或根据公式计算;
对于两个符号不同的操作数的情况,可以先取余数或者根据公式计算结果。如果结果为0,则不需要继续操作。如果不是0,还必须取第二个操作数的补数。(比如5%-4,先把结果算成1,而不是0,那么1对4的补数就是3,结果就是——。还有最后一步,保证结果的符号和第二个操作数的符号相同!所以,5%-4的结果是-3。)
你可以这样理解Python的模运算:首先规定结果与第二个操作数符号相同,后面是x% y,如果y是正数,假设y=4,则表示数轴对应关系为:
.3 0 1 2 3 0 1 2 30 1 .
.-5 -4 -3 -2 -1 0 1 2 3 4 5 .
如果y为负,假设y=-4,则表示数轴对应关系为:
.1 0 3 2 1 0 3 2 1 0 3 .
.-5 -4 -3 -2 -1 0 1 2 3 4 5 .
那么,C语言中的模运算可以这样理解:首先规定结果与第一个操作数符号相同;其次,无论正负,以5%4或5%-4为例,数轴对应为:
.1 0 3 2 1 0 1 2 3 0 1 .
.-5 -4 -3 -2 -1 0 1 2 3 4 5 .
O()o,事情变得有点复杂了。最后贴一张Python下的操作截图:
所以在实现不确定的情况下,保险的做法是先把操作数转换成正数,再根据需要进行调整。
这篇文章来自一个晚上很震撼的博客。转载请保留出处。
由Disqus支持的博客评论