Ce face Math.floorDiv
Operatorul / între întregi taie rezultatul spre zero, iar % are semnul deîmpărțitului: -7 / 2 este -3, iar -7 % 2 este -1. Math.floorDiv(x, y) rotunjește în schimb în jos (-7 / 2 → -4), iar Math.floorMod(x, y) dă un rest cu semnul împărțitorului, deci pentru y pozitiv restul este mereu între 0 și y - 1. Este forma potrivită pentru calcule circulare: zile ale săptămânii, ore, indici în listă.
Math.ceilDiv(x, y) (Java 18) rotunjește împărțirea în sus: ceilDiv(125, 50) este 3, fără să treci prin double. Math.ceilMod returnează restul potrivit acestei împărțiri: x - ceilDiv(x, y) * y, care pentru y pozitiv este 0 sau negativ.
Toate aruncă ArithmeticException la împărțirea la zero.
Parametri
| Parametru | Descriere |
|---|---|
x |
Deîmpărțitul. |
y |
Împărțitorul (diferit de 0). |
Ce returnează
Câtul rotunjit sau restul corespunzător, de tip întreg.
Exemple
Exemplul 1: Comparație cu / și %
public class Main {
public static void main(String[] args) {
int x = -7, y = 2;
System.out.println("/ = " + (x / y) + ", % = " + (x % y));
System.out.println("floorDiv = " + Math.floorDiv(x, y) + ", floorMod = " + Math.floorMod(x, y));
System.out.println("ceilDiv = " + Math.ceilDiv(x, y) + ", ceilMod = " + Math.ceilMod(x, y));
System.out.println("ceilDiv(7, 2) = " + Math.ceilDiv(7, 2) + ", ceilMod(7, 2) = " + Math.ceilMod(7, 2));
}
}
Rezultat
/ = -3, % = -1
floorDiv = -4, floorMod = 1
ceilDiv = -3, ceilMod = -1
ceilDiv(7, 2) = 4, ceilMod(7, 2) = -1
Exemplul 2: Ziua săptămânii peste sau acum câteva zile
Cu %, mersul înapoi dă indici negativi; floorMod rămâne mereu între 0 și 6.
public class Main {
public static void main(String[] args) {
String[] zile = {"luni", "marți", "miercuri", "joi", "vineri", "sâmbătă", "duminică"};
int azi = 2;
int[] deplasari = {2, 10, -3, -9};
for (int d : deplasari) {
System.out.println(d + " zile: " + zile[Math.floorMod(azi + d, 7)]);
}
}
}
Rezultat
2 zile: vineri
10 zile: sâmbătă
-3 zile: duminică
-9 zile: luni
Exemplul 3: Pagini necesare pentru o listă
public class Main {
public static void main(String[] args) {
int produse = 47;
int pePagina = 10;
System.out.println("Pagini: " + Math.ceilDiv(produse, pePagina));
System.out.println("Pe ultima pagină: " + (produse - (Math.ceilDiv(produse, pePagina) - 1) * pePagina));
}
}
Rezultat
Pagini: 5
Pe ultima pagină: 7
Greșeli frecvente
- Calculezi
(i - 1) % npentru elementul anterior dintr-o listă circulară: lai = 0rezultatul este -1. FoloseșteMath.floorMod(i - 1, n). - Crezi că
floorDivși/diferă mereu: pentru numere pozitive dau același rezultat; diferența apare doar când semnele diferă.
Comenzi înrudite
Math.floor: floor() rotunjește în jos (spre minus infinit), ceil() rotunjește în sus (spre plus infinit); ambele returnează double.Math.floorDivExact: Variante ale împărțirii întregi care aruncă ArithmeticException la overflow, în loc să returneze un rezultat greșit.Math.addExact: Adunare, scădere, înmulțire, incrementare și negare care aruncă ArithmeticException la overflow în loc să dea rezultat greșit.Math: Clasa cu funcții matematice gata făcute: rotunjiri, puteri, radicali, trigonometrie, minim/maxim și calcule întregi sigure.