详解负数取模运算

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

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

取模运算

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

《详解负数取模运算》

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

truncate

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

《详解负数取模运算》

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

简单,粗暴。

floor

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

《详解负数取模运算》

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

结论

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

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/hk2291976/article/details/52775299
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞