详解负数取模运算

版权声明:博主辛辛苦苦码的字哦~转载注明一下啦~ https://blog.csdn.net/hk2291976/article/details/52775299

有人如果在python上使用%运算,肯定会遇到这样的问题,就是它在负数上的结果和我们之前在C或JAVA上的结果不一样。比如: -6 % 5这个运算,在python中的结果是4,但是在C/JAVA上的结果是-1

这是为什么呢?wiki百科的解释很好,英文好的可以去看看,这里做一个简单的搬运:

取模运算

所谓取模运算在数学上就是通过辗转相除法得到的余数,一般满足下面这个式子:

{\displaystyle {\begin{aligned}q\,&\in \mathbb {Z} \\a\,&=nq+r\\|r|\,&<|n|\end{aligned}}}

所以,r = a - nq,而q的计算历史上出了2个分支:

truncate

这派的思想很简单,就是截去小数部分。

r=a-n\operatorname {trunc} \left({\frac {a}{n}}\right)

比如3/2 = 1 , -3/2 = -1

简单,粗暴。

floor

floor是Donald Knuth大神提出来的,它的意思是像下取整。这个就有意思了,因为在正数的时候和truncate一样,但是在负数的时候,向下取整就会出现和truncate不一样的结果。

r=a-n\left\lfloor {\frac {a}{n}}\right\rfloor

扫描二维码关注公众号,回复: 3760883 查看本文章

比如:3/2 = 1 -3/2 = -2

其他

当然还有其他的一些人提出的一些别的方案,但是都大同小异,有些要确保r为正,有些在正数和负数的时候做不同的操作……

运用

C

C还有JAVA使用的truncate的方法,所以在计算-6 % 5 的时候是这么算的:

-6 - (5*trunc(-6/5))= -6 - (5 * -1) = -1

python

python使用的floor除法的方式

-6 - (5*floor(-6/5))= -6 - (5 * -2) = 4

结论

反正,在取模运算上,基本不同的语言都有自己的一套机制,一般来说,这套机制在正数上都一样,所以为了避免出现不必要的问题,建议先把负数转成正数再做取模运算。

猜你喜欢

转载自blog.csdn.net/hk2291976/article/details/52775299
今日推荐