Класс Java Math
Выполняйте математические операции в Java с помощью Math.abs, Math.sqrt, Math.pow, Math.random и других статических методов.
Класс java.lang.Math — это набор статических методов для математических операций, выходящих за рамки базовых +, -, *, /, % операторов. Абсолютные значения, степени, корни, тригонометрия, логарифмы, округление и случайные числа — всё это здесь. Поскольку Math входит в пакет java.lang, он импортируется неявно — вам не нужно писать инструкцию import, можно сразу вызывать методы напрямую: Math.sqrt(2).
На этой странице рассматривается каждая группа методов, показываются точные возвращаемые значения и описываются подводные камни (какие методы возвращают double, а какие long, почему тригонометрия работает в радианах и когда Math не подходит). Все методы являются static, поэтому они вызываются на самом классе, а не на экземпляре.
Абсолютное значение, min, max
Math.abs(-7); // 7
Math.abs(-3.14); // 3.14
Math.min(3, 5); // 3
Math.max(3, 5); // 5
Math.min(1.5, 1.7); // 1.5Все четыре метода перегружены для типов int, long, float и double.
Степени и корни
Math.pow(2, 10); // 1024.0 — always returns double
Math.sqrt(2); // 1.4142135623730951
Math.cbrt(27); // 3.0
Math.exp(1); // 2.718281828... — e^xДля целочисленных показателей степени Math.pow избыточен — цикл или оператор << работают быстрее.
Логарифмы
Math.log(Math.E); // 1.0 — natural log (ln)
Math.log10(1000); // 3.0 — base-10 log
Math.log(8) / Math.log(2); // 3.0 — log base 2В Java нет встроенного метода «логарифм по основанию N», поэтому он вычисляется по формуле смены основания: Math.log(x) / Math.log(base). Для повышенной точности вблизи x = 1 используйте Math.log1p(x), который вычисляет ln(1 + x), и Math.expm1(x), который вычисляет e^x - 1 без потери значимых цифр.
Округление
| Метод | Поведение |
|---|---|
Math.floor(x) | округление вниз (к -∞), возвращает double |
Math.ceil(x) | округление вверх (к +∞), возвращает double |
Math.round(x) | округление к ближайшему, при равноудалённости — вверх; возвращает long для double, int для float |
Math.rint(x) | округление к ближайшему, при равноудалённости — к чётному; возвращает double |
Math.floor(2.7); // 2.0
Math.ceil(2.1); // 3.0
Math.round(2.5); // 3 — ties round up
Math.round(-2.5); // -2 — toward positive infinity
Math.rint(0.5); // 0.0 — banker's rounding
Math.rint(1.5); // 2.0Для округления с учётом десятичных знаков (например, до двух знаков для денежных значений) используйте BigDecimal с RoundingMode.
Тригонометрия
Все тригонометрические функции работают в радианах. Для преобразования используйте Math.toRadians / Math.toDegrees:
Math.sin(Math.PI / 2); // 1.0
Math.cos(0); // 1.0
Math.tan(Math.PI / 4); // 0.999999... (≈ 1)
Math.toRadians(180); // Math.PI
Math.toDegrees(Math.PI); // 180.0
Math.atan2(1, 1); // π/4 — handles quadrant correctlyMath.atan2(y, x) — правильный инструмент для определения угла вектора, а не Math.atan(y/x).
Константы
Math.PI; // 3.141592653589793
Math.E; // 2.718281828459045Случайные числа
Math.random() возвращает значение типа double равномерно распределённое в диапазоне [0.0, 1.0):
double r = Math.random(); // 0.0 ≤ r < 1.0
int dieRoll = 1 + (int)(Math.random() * 6); // 1..6Для более сложных задач (с заданным зерном, воспроизводимых, с диапазонами, гауссовых) используйте java.util.Random или java.util.concurrent.ThreadLocalRandom:
import java.util.Random;
Random rng = new Random(42); // seeded, reproducible
int n = rng.nextInt(100); // 0..99
double g = rng.nextGaussian(); // normal distributionДля криптографических токенов не используйте Math.random или Random — применяйте java.security.SecureRandom.
Арифметика с проверкой переполнения
Методы Math.addExact, subtractExact, multiplyExact, negateExact, incrementExact, decrementExact выбрасывают ArithmeticException при целочисленном переполнении:
Math.addExact(Integer.MAX_VALUE, 1); // throws ArithmeticExceptionПолезно, когда корректность важнее скорости.
Демонстрация
Что дальше
- Операторы Java — арифметика
+,-,*,/,%, на которой строитсяMath. - Типы данных Java — почему
Math.powвозвращаетdoubleи когдаintпереполняется. - Пользовательский ввод в Java с помощью Scanner — чтение чисел и текста из терминала.