1. 程式人生 > 程式設計 >java 取模與取餘的區別說明

java 取模與取餘的區別說明

取模與取餘的區別

對於整型數a,b來說,取模運算或者求餘運算的方法都是:

1.求 整數商: c = a/b;

2.計算模或者餘數: r = a - c * b

求模運算和求餘運算在第一步不同: 取餘運算在取c的值時,向0 方向舍入(fix()函式);而取模運算在計算c的值時,向負無窮方向舍入(floor()函式)。

例如計算:-7 Mod 4

那麼: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程式示例:

public static void main(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異常。

如:

 class Test
 {
 public static void main(String args[])
 {
 System.out.println(3/0);
 System.out.println(3%0);
 }
 }

2 小數除法中,除數為0,輸出一個Infinity常量。小數取餘運算中,除數為0,丟擲一個NaN常量。浮點數有無限值和Nan(非數值)概念。

如:

 class Test
 {
 public static void main(String args[])
 {
 System.out.println(3.0/0);
 System.out.println(3.0%0);
 }
 }

3 NaN是java語言中特有的數,由Float 和 Double兩個封裝類提供,且不能把它作為一個普通數用於運算中,如==運算,NaN用於比較運算中,不會顯示錯誤,但都只輸出false。因此NaN只是通過呼叫isNaN()方法來判定是否一個東西是否數值;但在equals()方法中比較的是內容,就看具體資料了。

如:

 class Test
 {
 public static void main(String args[])
 {
 double x = 64.0;
 double y = 0.0;
 
 System.out.println(x%y == x%y);
 }
 }

顯示:false

如:

 Double a = new Double(Double.NaN);
 Double b = new Double(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(負無窮),可用於比較邏輯運算中。

如:

class Test
 {
 public stativ void main(String args[])
 {
 System.out.println(Float.NaN == Float.NaN);
 System.out.println(Float.POSITIVE_INFINITY == Float.POSITIVE_INFINITY)
 }
 }

顯示:false,true

3 在取餘操作中,餘數的正負符號完全取決於左運算元,和作運算元的正負號一致。

如:

 class Test
 {
 public static void main(String args[])
 {
 byte x = -64;
 byte y = -6;
 
 System.out.println(x/y + " " + x%y);

 x = 64;
 System.out.println(x/y + " " + x%y);
 }
 }

顯示:10,-4 -10 4

4 小數取餘,用左邊的運算元連續減去右邊的運算元,直到結果小於右邊的運算元,此結果為餘。即對商截去小數位後的運算。

如:

 class Test
 {
 public static void main(String args[])
 {
 double x = 64.5;
 double y = 6.0;
 
 System.out.println(x/y + " " + x%y);
 }
 }

顯示:10.75,4.5

以上這篇java 取模與取餘的區別說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。