初学 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 classTestMod {
- public static voidmain(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);
- }
- }
得到输出:
本文参考:
致谢!
注意:
看别人博文不只是要关注博文内容, 也可以关注对应的评论者留言等, 不是尽信书.
来源: http://www.bubuko.com/infodetail-2986800.html