负数求余(模)

2019-04-13 14:48发布

结论

求模运算是商向0取值,而求余运算是商向负无穷取值。 最近在微信群看到了一个有趣的问题,问5%(-2)结果是多少?(-5)%2呢?相信大家对正数的求余(模)都很清楚,但是负数呢?求余后的数到底是正还是负,不能非常肯定。为此我找了一些资料,写下了这篇文章。文章并不是很严谨,可能会有很多纰漏,不过我希望能解决一些人的疑惑。 编程语言中 %运算 可能是求余运算,也可能是求模运算。不同编程语言可能是不一样的,不过貌似较多的是求模运算。请在具体环境中试验。 下面是百度百科的解释。
取模运算(“Modulo Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。
大概就是说,求模和求余几乎没什么区别,区别是操作有点不同,也就是我要说的:求模运算是商向0取值,而求余运算是商向负无穷取值。 举个例子。 5%2

求模

求模是多少?首先5/2=2.5,商必须是整数,这时候面临两种选择:取2还是取3?因为我们是取模运算,我们的整数商要倾向于0,其实就是去掉小数位,所以商取2,所以5-(2*2)=1,最后结果是1,即5%2=1。

求余

这时候我们来求余,商要向负无穷取值,商取2,结果也是1。 那我们来看看负数的例子。 (-7)%10

求模

(-7)/10 = -0.7。求模商向0取值,也就是去掉小数位,因而商取0,所以(-7)-(10*0)=-7,结果是-7。

求余

求余商向负无穷取值,商取-1。(-7)-(10*1)=3。好了,结果是3。 其他数的计算思路也是这样的,只要你掌握了核心求模运算的商向0取整,求余运算的商向负无穷取整,然后多找几个数练习一下然后和答案对比一下,以后就不会出错了。比如5%(-2),求模是1,求余是-1。对了,你问我怎么检查?诶……貌似JavaScript是求模运算,Python是求余运算。你去这两种语言环境测试下吧,以上!

总结

  • 求模运算的商向0取整,求余运算的商向负无穷取整。
  • 不同的编程语言%操作符的实现可能会有所区别,请在真实环境中测试,确定是求模运算还是求余运算。
参考资料:
  1. http://baike.baidu.com/link?url=Oxk_f86KnvG-HIAj7g9qvkRMgZR4ilqKrYuX3qIxwL1zX1Oz_ZkfF06gm_JZyw0kiSVoKnnbbcxt67QpVqQ2YpxbVT07r79MRvu6YIJGvVfPVvp8ph_SBcFSx3lVdm-v
  2. https://www.zhihu.com/question/34116024