java 取模与取余的区别说明
取模与取余的区别
对于整型数a,b来说,取模运算或者求余运算的方法都是:
1.求整数商:c=a/b;
2.计算模或者余数:r=a-c*b
求模运算和求余运算在第一步不同:取余运算在取c的值时,向0方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。
例如计算:-7Mod4
那么:a=-7;b=4;
第一步:求整数商c,如进行求模运算c=-2(向负无穷方向舍入),求余c=-1(向0方向舍入);
第二步:计算模和余数的公式相同,但因c的值不同,求模时r=1,求余时r=-3。
归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。
当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。
另外各个环境下%运算符的含义不同,比如c/c++,java为取余,而python则为取模。
Java程序示例:
publicstaticvoidmain(String[]args){ System.out.println("-3,2取模"+Math.floorMod(-3,2)); System.out.println("-3,2取余"+-3%2); System.out.println("3,-2取模"+Math.floorMod(3,-2)); System.out.println("3,2取余"+3%-2); }
结果:
-3,2取模=1
-3,2取余=-1
3,-2取模=-1
3,2取余=1
补充知识:java中的除法和取余注意点
1整数除法中,除数为0,抛出一个算术异常ArithmeticException。整数取余运算中,除数为0,抛出一个ArithmeticException异常。
如:
classTest { publicstaticvoidmain(Stringargs[]) { System.out.println(3/0); System.out.println(3%0); } }
2小数除法中,除数为0,输出一个Infinity常量。小数取余运算中,除数为0,抛出一个NaN常量。浮点数有无限值和Nan(非数值)概念。
如:
classTest { publicstaticvoidmain(Stringargs[]) { System.out.println(3.0/0); System.out.println(3.0%0); } }
3NaN是java语言中特有的数,由Float和Double两个封装类提供,且不能把它作为一个普通数用于运算中,如==运算,NaN用于比较运算中,不会显示错误,但都只输出false。因此NaN只是通过调用isNaN()方法来判定是否一个东西是否数值;但在equals()方法中比较的是内容,就看具体数据了。
如:
classTest { publicstaticvoidmain(Stringargs[]) { doublex=64.0; doubley=0.0; System.out.println(x%y==x%y); } }
显示:false
如:
Doublea=newDouble(Double.NaN); Doubleb=newDouble(Double.NaN); if(Double.NaN==Double.NaN) System.out.println("True"); else System.out.println("False"); if(a.equals(b)) System.out.println("True"); else System.out.println("False");
显示:false,true
而Infinity(极限数)即可进行比较,POSITIVE_INFINITY(正无穷)和NEGATIE_INFINITY(负无穷),可用于比较逻辑运算中。
如:
classTest { publicstativvoidmain(Stringargs[]) { System.out.println(Float.NaN==Float.NaN); System.out.println(Float.POSITIVE_INFINITY==Float.POSITIVE_INFINITY) } }
显示:false,true
3在取余操作中,余数的正负符号完全取决于左操作数,和作操作数的正负号一致。
如:
classTest { publicstaticvoidmain(Stringargs[]) { bytex=-64; bytey=-6; System.out.println(x/y+""+x%y); x=64; System.out.println(x/y+""+x%y); } }
显示:10,-4-104
4小数取余,用左边的操作数连续减去右边的操作数,直到结果小于右边的操作数,此结果为余。即对商截去小数位后的运算。
如:
classTest { publicstaticvoidmain(Stringargs[]) { doublex=64.5; doubley=6.0; System.out.println(x/y+""+x%y); } }
显示:10.75,4.5
以上这篇java取模与取余的区别说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。