百分号(%)是求余操作符。22%5即从22中拿走5,再拿走5...不够拿走,就余下了4。代码放在:
package semantics.statement;
public class ArithmeticOpDemo{
}
求余操作符有一些需要注意的细节。
- 整数与浮点数的不同
- 整数除法遵循规则
1.浮点数
通常我们不对浮点数求余。
static void remainderOperator(){
pln("15 / 4.0 = "+ 15/4.0);
pln("15 % 4.0 = "+ 15%4.0);
pln("7 % 2.2 = "+ 7 % 2.2);
}
15 / 4.0 = 3.75
15 % 4.0 = 3.0
7 % 2.2 = 0.39999999999999947
虽然15 % 4.0 比较理想,但是7 % 2.2不是我们希望的0.4,解释起来也麻烦。
2.整数除法遵循规则
如果两个操作数都是正整数,如同还没有学过小数的小朋友的计数方式。这是常用的方式,13 % 5 = 3
2 % 5 = 2
有奇葩问:13 / 5.0 = 2.6,那么余数是不是2.6的小数点后面的6。
我们只能够说,13 / 5.0 = 2.6,的确13 / 5 = (int)Math.floor(13 / 5.0),即2,你在这一步是对的,
那么,余数13 % 5 = 13- (13 / 5)*5 = 13-2*5 =3整数除法遵循规则:
(x/y)*y + x %y == x
x %y = x - (x/y)*y
如果负数参与计算,x/y 的结果很容易理解,可以将符号先写出来。
pln("-13/ 5 = "+ -13 / 5); // -2
pln("13/ -5 = "+ 13 / -5); // -2pln("-13/ -5 = "+ -13 / -5); // 2
但是,从x %y = x - (x/y)*y 可知,
-13% 5 = -13 - (-2) *5 = -13+10 = -3
13% -5 = 13 - (-2) *(-5) = 13 -10 = 3-13%-5 = -13 - 2*(-5) = -13 +10 = -3
虽然不难,但是一会3一会-3,程序猿通常很懒的,不希望搞这种东西。所以,
当%的一个或两个操作数是负数时,理解起来并不直观,因而应避免在负数时使用%。
3.i%2==0
求余操作时,0是个好东西,如同C语言中的0. 判断i是否偶数,使用if(i%2==0);判断i是否奇数数,不要if(i%2==1) ,因为还有i%2== -1。
例如打印[-1,6]之间的奇数:
static void remainderOp(){
for(int i = -1; i<6; i++ ){
if(i%2==0){
continue;
}
System.out.println("i =" + i);
}
}
i =-1
i =1
i =3
i =5
如果是代码
static void remainderOp(){
for(int i = -1; i<6; i++ ){
//if(i%2==0) continue;System.out.println("i =" + i);
if(i%2==1){
System.out.println("i =" + i);
}
}
}
i =1
i =3
i =5