关于负数取模问题的一点说明

         今天听见办公室有人在讨论负数取模的问题,一直没太在意。但是不断听着他们猜测和讨论,我实在有些坐不住了,猜测,感觉,然后自我满足的归纳,这并不是一种客观的方法!

于是查了点资料,再自己实践中操作验证了下。得到下面的结论:

如果你在python上使用%运算,可能有学生会问到你一些看起来奇怪点的问题,

比如: -6%5这个运算,在python中的结果是4,

但是在C++/JAVA上的结果是-1;

这说明不同的语言返回的结果不一样,那么原因是到底为什么?

wiki百科的解释很好,英文好的可以去看看

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

摘自: https://en.wikipedia.org/wiki/Modulo_operation

如果  a=nq+r (a,n,q,r在整数范围内,并且|r| < |n|) 所以,r = a - nq,

但是,针对q的值,历史上出现了2个分支:

做法一.truncate

这派

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

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

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

简单,粗暴。

// Java的测试程序

public class test201801Test {

    public static void main(String[] args)  {

            System.out.println(6%5); // 1

           System.out.println(6%-5); // 1

           System.out.println(-6%5); // -1

  }

}

// C++ 测试程序

#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{

    cout << 6 % 5 << endl;           // 1
    cout << 6 % -5 << endl;          // 1 
    cout << -6 % 5 << endl;          //  -1
    return 0;
}

做法二.floor

floor意思是像下取整。这个就有意思了,因为在正数的时候和truncate一样,但是在负数的时候,

向下取整就会出现和truncate不一样的结果。

Python中:

math.floor(-6/5)

Out[20]: -2

Python中使用该方法:

r = -6 - 5*(-2)= 4

-6%5

Out[17]: 4

6%-5

Out[22]: -4

python使用的floor除法的方式:

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

r = 6 - (-5)*(-2) = -4

对于这种依赖平台或者语言的问题,一般的,为了避免出现不必要的问题,建议先把负数转成正数再做取模运算

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值