Ce face Math.floorDivExact
Împărțirea întreagă poate da overflow într-un singur caz: Integer.MIN_VALUE / -1. Rezultatul corect, 2147483648, nu încape într-un int, așa că operatorul / returnează în tăcere tot Integer.MIN_VALUE.
Math.divideExact(x, y) face aceeași împărțire ca / (rotunjire spre zero), floorDivExact ca floorDiv (în jos), iar ceilDivExact ca ceilDiv (în sus). Diferența: în cazul de overflow aruncă ArithmeticException. Au fost adăugate în Java 18, alături de celelalte metode Exact.
Parametri
| Parametru | Descriere |
|---|---|
x |
Deîmpărțitul. |
y |
Împărțitorul (diferit de 0). |
Ce returnează
Câtul, de tip int sau long. Aruncă ArithmeticException la overflow sau la împărțirea la zero.
Exemple
Exemplul 1: Overflow-ul ascuns al împărțirii
public class Main {
public static void main(String[] args) {
int min = Integer.MIN_VALUE;
System.out.println(min / -1);
try {
System.out.println(Math.divideExact(min, -1));
} catch (ArithmeticException e) {
System.out.println("divideExact: " + e.getMessage());
}
try {
System.out.println(Math.floorDivExact(min, -1));
} catch (ArithmeticException e) {
System.out.println("floorDivExact: " + e.getMessage());
}
}
}
Rezultat
-2147483648
divideExact: integer overflow
floorDivExact: integer overflow
Exemplul 2: Rezultate obișnuite
Când nu apare overflow, rezultatele sunt aceleași ca la /, floorDiv și ceilDiv.
public class Main {
public static void main(String[] args) {
System.out.println(Math.divideExact(-7, 2));
System.out.println(Math.floorDivExact(-7, 2));
System.out.println(Math.ceilDivExact(-7, 2));
System.out.println(Math.ceilDivExact(125, 50));
}
}
Rezultat
-3
-4
-3
3
Greșeli frecvente
- Crezi că
divideExactverifică dacă împărțirea are rest: nu, „exact” se referă la overflow.divideExact(7, 2)returnează 3 fără eroare.
Comenzi înrudite
Math.floorDiv: Împărțire întreagă rotunjită în jos (floorDiv) sau în sus (ceilDiv), cu restul potrivit (floorMod, ceilMod).Math.addExact: Adunare, scădere, înmulțire, incrementare și negare care aruncă ArithmeticException la overflow în loc să dea rezultat greșit.Math.toIntExact: Transformă un long în int și aruncă ArithmeticException dacă valoarea nu încape, în loc să o taie în tăcere.