前言:发现有不少人阅读了这篇文章,并且,指出了文章中存在的问题。其实,我本人好久之前也觉得文章的介绍有部分问题,且不够简洁,一直想着做出修改,却一拖再拖。最近两天(2021年7月22日),又接触了取模和取余的相关知识,同时取模和取余有相似之处,也都很容易遇到,所以一起介绍。觉得时机成熟了,是时候对本文做出完善了。
一 取余和取模的定义
对于整型数a,b来说,取模运算或者求余运算的方法都是:
- 求整数商: c = a/b
- 计算模或者余数: r = a - c*b
取余运算在取c的值时,向0的方向舍入;取模运算在计算c的值时,向负无穷方向舍入
如下图所示:如果c(即a/b的商)的结果为正数,如1.5,那么对于取余和取模的处理是相同的,c舍入后的结果都为1;如果c的结果为负数,如-1.5,那么对于取余是向0的方向舍入,c舍入后的结果为-1,但是,对于取模是向负无穷的方向舍入,舍入后的结果为-2;
取个例子,3 % -2
c = a / b = 3/-2 = -1.5 c向0的方向舍入为-1
r = a - c * b = 3 - (-1) * (-2) = 1
即3 % -2 = 1
二 取余的规律总结
考虑了a和b可能出现的几乎是所有的情况(除了a等于b的情况,其取余等于0),这样总结的规律更有普遍性。
package com.company.app;
public class ModTest {
public static void main(String[] args) {
// a的绝对值大于b
System.out.println(" 2 % 3 = " + 2 % 3);
System.out.println("-2 % 3 = " + (-2) % 3);
System.out.println(" 2 %-3 = " + 2 % (-3));
System.out.println("-2 %-3 = " + (-2) % (-3));
System.out.println();
// a的绝对值小于b
System.out.println(" 3 % 2 = " + 3 % 2);
System.out.println("-3 % 2 = " + (-3) % 2);
System.out.println(" 3 %-2 = " + 3 % (-2));
System.out.println("-3 %-2 = " + (-3) % (-2));
}
}
}
}
运行结果如下:
规律:先使用a的绝对值和b的绝对值进行取余运算(或理解成先去掉符号也可以,并且两个正数的取余运算相对容易),然后取余的结果正负号和a保持一致。
我们可以进一步总结出如果a的绝对值小于b的绝对值,则余数就是a。本质还是通过上面的规律计算出来的。
有时候面试题中会让我们计算a/b的商和余数,我们根据上面的计算结果继续总结(可以验算 除数=商*被除数 + 余数):
表达式 除数a / 被除数b | 商 | 余数 |
---|---|---|
2 / 3 | 0 | 2 |
-2 / 3 | 0 | -2 |
2 / -3 | 0 | 2 |
-2 / -3 | 0 | -2 |
3 / 2 | 1 | 1 |
-3 / 2 | -1 | -1 |
3 / -2 | -1 | 1 |
-3 / -2 | 1 | -1 |
当a的绝对值小于b时,商0,余数为a; 当a的绝对值大于b时,先使用a的绝对值和b的绝对值进行运算,得出商和余数。商的符号,除数a和被除数b的符号相同则为正,不同则为负。余数的符号取决于除数a;
以上2021-7-22更新,取模运算的规律正在更新中。。。| 下面的文章不推荐浏览。
一,直击现场
下面我来抛出几道题: 说明m是商,n是余数; (1)正数%正数 3%2=m.......n 2%3=m.......n (2)正数%负数或者负数%正数 -3%2=m.......n 3%-2=m.......n -2%3=m.......n 2%-3=m.......n (3)负数%负数 -3%-2=m.......n -2%-3=m.......n
二,验证时刻
下面的结果没有商m只有余数n;有没有全部答对呢?没有的话来看总结吧
三,总结
(1) 3%2=1.......1 2%3=0.......1 正数除以正数:
商正余正
(2) -3%2=-1.......-1 3%-2=-1.......1 -2%3=0.......-2 2%-3=0.......2 除数或者被除数其中之一为负数:
先按正数计算,商负余同被除数
(余数和被除数同号)你可能对结果0有疑问,你可以把它当成负0,因为被除数=除数*商+余数,所以被除数是希望商乘以除数的结果是接近它的(如最后一组数被除数2是希望-3乘以0后的结果是接近它的,所以可以理解为0是负0,这样就普遍适用了) (3) -3%-2=1.......-1 -2%-3=0.......-2 两个数都是负数:
先按正数计算,商正余负
(对于第二组可理解为0是正0,解释同上)