Math.floorDiv în Java

Împărțire întreagă rotunjită în jos (floorDiv) sau în sus (ceilDiv), cu restul potrivit (floorMod, ceilMod).

Sintaxă
static int floorDiv(int x, int y)   // și long
static int floorMod(int x, int y)
static int ceilDiv(int x, int y)   // Java 18
static int ceilMod(int x, int y)   // Java 18

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) % n pentru elementul anterior dintr-o listă circulară: la i = 0 rezultatul este -1. Folosește Math.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.