初学java的时候接触的%这个符号

       百分号?

       求余?

       取模?

我只知道不是百分号,好像是求余,听别人那叫求模运算符,跟求余一样,于是我便信了。

 

思考之后开始迷糊,然后经过多次考证得到以下结论。

首先,%是求余的意思,不是求模的意思。求模不完全等于求余。

       首先我们遵守公式:

              a = b * q + r;

              这里的a是被除数,b是除数,q是商,r是余数也可以是模。

              q= a/b 且 |r| < |b|

              于是得到:

              r = a – (a/b)*b;

r的求值公式都是这样,那么求余和求模的区别在哪呢?

       1、

java求余单位是%

              java中求模使用的是Math.floorMod(被除数, 除数)方法

       2、

求余追求的是商的绝对值最小

              求模追求的是商的值最小

              也就是说a/b得到的值在求余和求模中可能是不一样的,如果a/b得到的是正数,那么商的绝对值和商的值相等,求余的结果和求模的结果一致。

       当a>0,b>0 则a%b >=0 且Math.floorMod(a,b) >=0

       当a<0,b<0, 则 被除数 -(除数*商),已知商的绝对值取最小的,也就是说|被除数|>|除数*商|。所以a%b <=0 且Math.floorMod(a,b) <=0

       当ab异号 则 a/b小于0,也就是商小于0,除数小于0, r的值的正负取决于 |商*除数| 与 |被除数|的比较

       当a>0,b<0的时候

              求余,要求商的绝对值最小,所以 |被除数|> |商*除数| ,得到值>0

              求模,要求商的值最小,也就是 |被除数| < |商*余数| , 得到值<0

       当a<0,b>0的时候

              求余,要求商的绝对值最小,所以 |被除数|> |商*除数| ,得到值<0

              求模,要求商的值最小,也就是 |被除数| < |商*余数| , 得到值>0

 

总结:

       当被除数和除数同号的时候,求余和取模得到的结果是相等的

       求余得到商的过程是先用绝对值求商再添上正负号

       求模得到商的过程是用绝对值求商的值+1再添正负号,能整除的除外。

       求余过程中:

              余数的正负号取决于被除数,被除数为正则为正,被除数为负则为负

       求模过程中:

              模的正负号取决于除数,除数为正则为正,除数为负责为负

 

例子:

public class TestMod {
    public static void main(String[] args){
        System.out.println("17模以3的值为:" + Math.floorMod(17, 3));
        System.out.println("17除以3的余为:" + 17 % 3);
        System.out.println("-17模以-3的值为:" + Math.floorMod(-17, -3));
        System.out.println("-17除以-3的余为:" + -17 % -3);
        System.out.println("-17模以3的值为:" + Math.floorMod(-17, 3));
        System.out.println("-17除以3的余为:" + -17 % 3);
        System.out.println("17模以-3的值为:" + Math.floorMod(17, -3));
        System.out.println("17除以-3的余为:" + 17 % -3);
    }
}

得到输出:

java中求余%与取模floorMod的区别_求余

 

致谢!

 

注意:

       看别人博文不只是要关注博文内容,也可以关注对应的评论者留言等,不是尽信书。