当前位置:   article > 正文

Java 取余运算符 % 实例测试与探究_-1对5取余

-1对5取余

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

    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

运算结果如下:

 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

分析:

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

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
  • 3

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/274395
推荐阅读
相关标签
  

闽ICP备14008679号