初学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);
}
}
得到输出:
致谢!
注意:
看别人博文不只是要关注博文内容,也可以关注对应的评论者留言等,不是尽信书。