Math.floorDivExact în Java

Variante ale împărțirii întregi care aruncă ArithmeticException la overflow, în loc să returneze un rezultat greșit.

Sintaxă
static int divideExact(int x, int y)   // și long
static int floorDivExact(int x, int y)
static int ceilDivExact(int x, int y)

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ă divideExact verifică 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.