赞
踩
遇到一个 -1%5
等于 1 还是 -1 的问题,通过查阅资料解决了该问题,并对 Java 取余运算符 % 有了深入的了解。
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
分析:
取模运算(“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中有关负数取余的计算
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。