Math.abs în Java

Returnează valoarea absolută (fără semn) a unui număr; absExact aruncă excepție în cazul special al valorii minime.

Sintaxă
static int abs(int a)   // și long, float, double
static int absExact(int a)   // Java 15, și long

Ce face Math.abs

Math.abs(x) returnează x dacă este pozitiv și -x dacă este negativ. Este folosit pentru distanțe, diferențe și abateri: Math.abs(a - b) este distanța dintre a și b, indiferent care e mai mare.

Există un caz-capcană: Math.abs(Integer.MIN_VALUE) returnează tot Integer.MIN_VALUE, un număr negativ, pentru că 2147483648 nu încape într-un int. Math.absExact (Java 15) aruncă în acest caz ArithmeticException, așa că eroarea nu trece neobservată.

Parametri

Parametru Descriere
a Numărul.

Ce returnează

Valoarea absolută, de același tip cu argumentul.

Exemple

Exemplul 1: Diferența de temperatură

public class Main {
    public static void main(String[] args) {
        int dimineata = -4;
        int pranz = 7;
        System.out.println("Diferența: " + Math.abs(pranz - dimineata) + " grade");
        System.out.println(Math.abs(-3.75));
        System.out.println(Math.abs(12));
    }
}

Rezultat

Diferența: 11 grade
3.75
12

Exemplul 2: Capcana valorii minime

public class Main {
    public static void main(String[] args) {
        System.out.println(Math.abs(Integer.MIN_VALUE));
        try {
            System.out.println(Math.absExact(Integer.MIN_VALUE));
        } catch (ArithmeticException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
        System.out.println(Math.absExact(-250));
    }
}

Rezultat

-2147483648
Eroare: Overflow to represent absolute value of Integer.MIN_VALUE
250

Exemplul 3: Compararea a două sume cu toleranță

Două valori double se consideră egale dacă diferența absolută este foarte mică.

public class Main {
    public static void main(String[] args) {
        double a = 0.1 + 0.2;
        double b = 0.3;
        System.out.println(a == b);
        System.out.println(Math.abs(a - b) < 1e-9);
    }
}

Rezultat

false
true

Greșeli frecvente

  • Presupui că Math.abs dă mereu un număr pozitiv: pentru Integer.MIN_VALUE și Long.MIN_VALUE rezultatul rămâne negativ.
  • Folosești Math.abs(hashCode()) % n pentru a alege o poziție: când hash-ul este exact MIN_VALUE, indicele iese negativ. Folosește Math.floorMod(hash, n).

Comenzi înrudite

  • Math.signum: signum() dă semnul unui număr (-1.0, 0.0 sau 1.0); copySign() pune semnul unui număr pe valoarea altuia.
  • 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: Clasa cu funcții matematice gata făcute: rotunjiri, puteri, radicali, trigonometrie, minim/maxim și calcule întregi sigure.