详解负数取模运算

有人如果在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

比如: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

结论

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

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值