Java 取余运算符 % 实例测试与探究

1 问题:

遇到一个 -1%5 等于 1 还是 -1 的问题,通过查阅资料解决了该问题,并对 Java 取余运算符 % 有了深入的了解。

2 观察以下运算实例:

package com.sjmp;


/**
 * @author: sjmp1573
 * @date: 2020/12/29 21:06
 * @description:
 */

public class Test {
    public static void main(String[] args) {

        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(" 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) );

    }
}

运算结果如下:

 2% 3 = 2
 2%-3 = 2
-2% 3 = -2
-2%-3 = -2
 3% 2 = 1
 3%-2 = 1
-3% 2 = -1
-3%-2 = -1

Process finished with exit code 0

分析:

  • 余数的符号与被除数保持一致;
  • 如果需要快速计算,计算的值与去除符号后的运算相同,加上被除数的符号即为结果。

3 Java 中取余运算符 % 探究

取模运算(“Modulus Operation”)和取余运算(“Remainder Operation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。

对于整型数 a 和 b 来说, a%b ,取模运算或者求余运算的方法都是:

Step01 求整数商: c = [a/b];
Step02 计算模或者余数: r = a - c*b.

求模运算和求余运算在第一步不同: 取余运算在取商 c 的值时,向 0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。

例如计算:-7 Mod 4
那么:a = -7;b = 4;

Step01 :求整数商 c,如进行求模运算 c = -2(向负无穷方向舍入),求余c = -1(向 0 方向舍入);
Step02 :计算模和余数的公式相同,但因 c 的值不同,求模时 r = 1,求余时r = -3。

归纳:当 a 和 b 符号一致时,求模运算和求余运算所得的 c 的值一致,因此结果一致。
当符号不一致时,结果不一样。

另外各个环境下 % 运算符的含义不同,比如c/c++,java 为取余,而 python 则为取模。

所以 Java 取余运算规则:a%b = a - (a/b)*b,其中【a/b 为向 0 取整】。

 -1% 5 = -1

Process finished with exit code 0

参考
[1] 百度百科——取模运算
[2] Java中的相除(/)和取余(%)的实现方法
[3]Java中有关负数取余的计算

你可能感兴趣的:(Java基础,java)