JavaRush /Java блог /Random UA /Java Math клас та його методи
Professor Hans Noodles
41 рівень

Java Math клас та його методи

Стаття з групи Random UA
У цій статті ми проведемо короткий огляд класу Math Java. Поговоримо про методи даного класу та про те, як їх використовувати. Клас Math розташовується в пакеті java.lang та надає набір статичних методів для здійснення низки різних математичних обчислень. Нижче наведено приклади обчислень, для яких клас Math може бути корисним:
  • Обчислення абсолютних значень (значень за модулем)
  • Обчислення значень тригонометричних функцій (синусів, косінусів тощо)
  • Зведення в різні ступені
  • Вилучення коренів різних ступенів
  • Генерація випадкових чисел
  • Округлення
  • та ін.
Нижче ми спробуємо розглянути як клас Java Math допомагає вирішувати перелічені вище завдання. Клас Java Math та його методи - 1Почнемо розбір класу з методів, які дозволяють обчислити значення модуля. За це відповідає метод abs. Цей метод перевантажений й у класі Math є такі його відмінності:
  • static double abs(double a)
  • static float abs(float a)
  • static int abs(int a)
  • static long abs (long a)
Приклад використання:
public static void main(String[] args) {
        System.out.println(Math.abs(-1));      // 1
        System.out.println(Math.abs(-21.8d));  // 21.8
        System.out.println(Math.abs(4532L));   // 4532
        System.out.println(Math.abs(5.341f));  // 5.341
    }

Обчислення значень тригонометричних функцій

Клас Math дозволяє обчислювати різні тригонометричні функції – синуси, косинуси, тангенси та ін. З повним переліком методів можна познайомитися на сайті офіційної документації . Нижче наведено деякий перелік даних методів:
  • static double sin(double a)
  • static double cos(double a)
  • static double tan(double a)
  • static double asin(double a)
  • static double acos(double a)
  • static double atan(double a)
Методи обчислюють: синус, косинус, тангенс, арксинус, арккосинус, арктангенс. Кожен метод обчислює значення для кута `a`. Цей параметр передається в кожен метод і в кожному випадку вимірюється в радіанах (а не в градусах, як ми звикли). Тут є дві новини, гарна та погана. Почнемо з гарної. У класі Math є методи для переведення радіанів у градуси і градусів у радіани:
  • static double toDegrees(double angrad)
  • static double toRadians(double angdeg)
Тут метод додекорів переведе кут angrad, що вимірюється в радіанах у градуси. А метод дорадіанів, навпаки, переводить кут angdeg, що вимірюється в градусах - у радіани. А погана новина в тому, що це відбувається з деякою похибкою. Наведемо приклад обчислення синусів та косінусів:
public static void main(String[] args) {
        System.out.println(Math.sin(Math.toRadians(0)));
        System.out.println(Math.sin(Math.toRadians(30)));
        System.out.println(Math.sin(Math.toRadians(90)));

        System.out.println(Math.cos(Math.toRadians(0)));
        System.out.println(Math.cos(Math.toRadians(30)));
        System.out.println(Math.cos(Math.toRadians(90)));
    }
Програма виведе:

0.0
0.49999999999999994
1.0

1.0
0.8660254037844387
6.123233995736766E-17
Що не зовсім відповідає таблицям синусів і косінусів, частково завдяки похибкам при переведенні з градусів у радіани.

Зведення в ступінь

Для зведення числа в ступінь клас Math надає метод pow, який має таку сигнатуру:
static double pow(double a, double b)
Даний метод зводить параметр `a` у ступінь `b`. Приклади:
public static void main(String[] args) {
        System.out.println(Math.pow(1,2)); // 1.0
        System.out.println(Math.pow(2,2)); // 4.0
        System.out.println(Math.pow(3,2)); // 9.0
        System.out.println(Math.pow(4,2)); // 16.0
        System.out.println(Math.pow(5,2)); // 25.0

        System.out.println(Math.pow(1,3)); // 1.0
        System.out.println(Math.pow(2,3)); // 8.0
        System.out.println(Math.pow(3,3)); // 27.0
        System.out.println(Math.pow(4,3)); // 64.0
        System.out.println(Math.pow(5,3)); // 125.0
    }

Вилучення коренів

Клас Math надає методи для вилучення коренів: квадратного та кубічного. За цю процедуру відповідають такі методи:
  • static double sqrt(double a)
  • static double cbrt(double a)
Метод sqrt – добує квадратний корінь (square root), а метод cbrt – кубічний (cube root). Приклади:
public static void main(String[] args) {
        System.out.println(Math.sqrt(4));   // 2.0
        System.out.println(Math.sqrt(9));   // 3.0
        System.out.println(Math.sqrt(16));  // 4.0

        System.out.println(Math.cbrt(8));   // 2.0
        System.out.println(Math.cbrt(27));  // 3.0
        System.out.println(Math.cbrt(125)); // 5.0
    }

Генерація випадкових чисел

Для генерації випадкових чисел клас Math надає метод random. Даний метод генерує випадкове позитивне речове (double) число у проміжку від 0.0 до 1.0. Сигнатура методу має такий вигляд:
public static double random()
Погляньмо на приклади:
public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        System.out.println(Math.random());
    }
}
Після виконання методу мейн на консоль вивелося:

0.37057465028778513
0.2516253742011597
0.9315649439611121
0.6346725713527239
0.7442959932755443
За допомогою невеликих маніпуляцій, можна використовувати метод random класу Math для отримання цілих випадкових чисел лежачих у певному діапазоні. Наведемо приклад функції, яка приймає два аргументи min і max і повертає випадкове ціле число, яке лежить у проміжку від min (включно) до max (включно):
static int randomInARange(int min, int max) {
    return  (int) (Math.random() * ((max - min) + 1)) + min;
}
Напишемо метод Main, в якому протестуємо метод randomInARange:
public class MathExample {


    public static void main(String[] args) {
        // Карта, в которой мы будем хранить количество выпадений якого-то числа
        Map<Integer, Integer> map = new TreeMap<>();

        // За 10000 операций
        for (int i = 0; i < 10000; i++) {

            // Сгенерируем рандомное число от -10 включительно до 10 включительно
            final Integer randomNumber = randomInARange(-10, 10);


            if (!map.containsKey(randomNumber)) {
                // Если карта еще не содержит "выпавшего случайного числа"
                // Положим его в карту с кол-вом выпадений = 1
                map.put(randomNumber, 1);
            } else {
                // Иначе, увеличим количество выпадений данного числа на 1
                map.put(randomNumber, map.get(randomNumber) + 1);
            }
        }

        // Выведем на экран содержимое карты в формате ключ=[значення]
        for (Map.Entry<Integer, Integer> entry : map.entrySet()){
            System.out.println(String.format("%d=[%d]", entry.getKey(), entry.getValue()));
        }
    }

    static int randomInARange(int min, int max) {
        return  (int) (Math.random() * ((max - min) + 1)) + min;
    }
}
Після запуску методу main висновок може бути таким:

-10=[482]
-9=[495]
-8=[472]
-7=[514]
-6=[457]
-5=[465]
-4=[486]
-3=[500]
-2=[490]
-1=[466]
0=[458]
1=[488]
2=[461]
3=[470]
4=[464]
5=[463]
6=[484]
7=[479]
8=[459]
9=[503]
10=[444]

Process finished with exit code 0

Округлення

Для округлення чисел Java одним із інструментів є методи класу Math. А точніше методи round, ceil та floor:
  • static long round(double a)
  • static int round(float a)
  • static double floor(double a)
  • static double ceil(double a)
Метод round - округляє так, як звичайно обивателю. Якщо дробова частина числа більша чи дорівнює 0.5, то число буде округлено у більшу сторону, інакше в меншу. Метод floor завжди, незалежно від значень дробової частини, округляє число меншу сторону (у бік негативної нескінченності). Метод ceil, навпаки, незалежно від значень дробової частини, округляє числа у велику сторону (у бік позитивної нескінченності). Погляньмо на приклади:
public static void main(String[] args) {
    System.out.println(Math.round(1.3)); // 1
    System.out.println(Math.round(1.4)); // 1
    System.out.println(Math.round(1.5)); // 2
    System.out.println(Math.round(1.6)); // 2

    System.out.println(Math.floor(1.3)); // 1.0
    System.out.println(Math.floor(1.4)); // 1.0
    System.out.println(Math.floor(1.5)); // 1.0
    System.out.println(Math.floor(1.6)); // 1.0

    System.out.println(Math.ceil(1.3)); // 2.0
    System.out.println(Math.ceil(1.4)); // 2.0
    System.out.println(Math.ceil(1.5)); // 2.0
    System.out.println(Math.ceil(1.6)); // 2.0
}

Висновок

У статті ми поверхово познайомабося з класом Math. Розглянули, як за допомогою цього класу можна:
  • Обчислювати значення за модулем;
  • обчислювати значення тригонометричних функцій;
  • Зводити числа до ступеня;
  • Видобувати квадратне та кубічне коріння;
  • генерувати випадкові числа;
  • Округлювати числа.
У даному класі є ще безліч інших цікавих методів. З якими можна ознайомитись на сайті офіційно документації . Ну а для першого знайомства, перерахованих методів вище цілком достатньо.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ