Числовые классы и класс Math в Java

Java Number

Обычно, когда нужны числа, мы обычно используем встроенные типы данных, например:byte、int、long、doubleи т. д.

Пример

int a = 5000; float b = 13.65f; byte c = 0x4a;

Однако в реальной разработке мы часто сталкиваемся с ситуациями, когда требуются объекты вместо встроенных типов данных. Чтобы решить эту проблему, язык Java предоставляет соответствующий класс-обёртку для каждого встроенного типа данных.

Все классы-обёртки(Integer、Long、Byte、Double、Float、Short)являются подклассами абстрактного класса Number.

Имя классаСоответствующий примитивный типОписание
ByteбайтКласс-обёртка Byte
ShortshortКласс-обёртка Short
IntegerintКласс-обёртка Integer
LonglongКласс-обёртка Long
FloatfloatКласс-обёртка Float
DoubledoubleКласс-обёртка Double
BigInteger-Неизменяемое целое число произвольной точности
BigDecimal-Неизменяемое знаковое десятичное число произвольной точности

Java Number类

Такой вид упаковки, специально поддерживаемый компилятором, называется boxing. Поэтому, когда встроенный тип данных используется как объект, компилятор упаковывает встроенный тип в класс-обёртку. Аналогично компилятор может также распаковать объект во встроенный тип.

Класс Number принадлежит пакету java.lang.

Number — абстрактный класс, основное назначение которого — предоставлять унифицированные методы преобразования для различных числовых типов:

Пример

public abstract class Number implements Serializable {
    // Абстрактные методы
    public abstract int intValue();
    public abstract long longValue();
    public abstract float floatValue();
    public abstract double doubleValue();
   
    // Добавлено в Java 8
    public byte byteValue() {
        return (byte)intValue();
    }
    public short shortValue() {
        return (short)intValue();
    }
}

Ниже приведён пример использования объекта Integer:

Код файла Test.java:

public class Test{ public static void main(String[] args){ Integer x = 5; x = x + 10; System.out.println(x); } }

Результат компиляции и запуска приведенного выше примера выглядит следующим образом:

15

Когда x присваивается целочисленное значение, поскольку x — объект, компилятор упаковывает x. Затем, чтобы x мог выполнить сложение, x нужно распаковать.

Примеры часто используемых методов

Преобразование примитивных типов

Пример

Number num = 1234.56; // На самом деле тип Double

System.out.println(num.intValue());    // 1234 (отбрасывает дробную часть)
System.out.println(num.longValue());   // 1234
System.out.println(num.floatValue());  // 1234.56
System.out.println(num.doubleValue()); // 1234.56

Сравнение чисел

Пример

java
Integer x = 10;
Double y = 10.0;

// Правильный метод сравнения: преобразовать к тому же типу перед сравнением
System.out.println(x.doubleValue() == y.doubleValue()); // true

Специальная обработка чисел

Обработка больших чисел

Пример

BigInteger bigInt = new BigInteger("12345678901234567890");
BigDecimal bigDec = new BigDecimal("1234567890.1234567890");

// Арифметика больших чисел
BigInteger sum = bigInt.add(new BigInteger("1"));
BigDecimal product = bigDec.multiply(new BigDecimal("2"));

Форматирование чисел

Пример

NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);

System.out.println(nf.format(1234.5678)); // "1,234.57"

Автоупаковка и распаковка

Java 5+ поддерживает автоматическое преобразование:

Пример

// Автоупаковка
Integer autoBoxed = 42; // Компилятор преобразует в Integer.valueOf(42)

// Автораспаковка
int autoUnboxed = autoBoxed; // Компилятор преобразует в autoBoxed.intValue()

Класс Math в Java

Класс Math — это математический служебный класс, предоставляемый Java, расположенный в пакете java.lang и содержащий статические методы для выполнения базовых числовых операций.

Math в Java содержит свойства и методы для выполнения базовых математических операций, таких как элементарные экспоненты, логарифмы, квадратные корни и тригонометрические функции.

Все методы Math определены как static, поэтому их можно напрямую вызывать в функции main через класс Math.

Код файла Test.java:

public class Test { public static void main (String []args) { System.out.println("Синус 90 градусов:" + Math.sin(Math.PI/2)); System.out.println("Косинус 0 градусов:" + Math.cos(0)); System.out.println("Тангенс 60 градусов:" + Math.tan(Math.PI/3)); System.out.println("Арктангенс 1:" + Math.atan(1)); System.out.println("Значение угла π/2:" + Math.toDegrees(Math.PI/2)); System.out.println(Math.PI); } }

Результат компиляции и запуска приведенного выше примера выглядит следующим образом:

90 度的正弦值:1.0
0度的余弦值:1.0
60度的正切值:1.7320508075688767
1的反正切值: 0.7853981633974483
π/2的角度值:90.0
3.141592653589793

Расширенные математические операции

1. Экспоненциальные и логарифмические операции

Пример

Math.exp(1);    // e^1 ≈ 2.718
Math.log(Math.E); // ln(e) = 1
Math.log10(100); // log10(100) = 2

2. Генерация случайных чисел

Пример

// Сгенерировать случайное число в диапазоне [0.0, 1.0)
double random = Math.random();

// Сгенерировать случайное целое число в диапазоне [1, 100]
int randomInt = (int)(Math.random() * 100) + 1;

3. Другие операции

Пример

Math.hypot(3, 4); // Вычислить sqrt(x²+y²) → 5.0
Math.IEEEremainder(10, 3); // Остаток IEEE → 1.0

4. Константные поля

Пример

Math.PI;    // π ≈ 3.141592653589793
Math.E;     // Основание натуральных логарифмов e ≈ 2.718281828459045

Методы классов Number & Math

В следующей таблице перечислены некоторые часто используемые методы классов Number & Math:

Нет. Метод и описание
1 xxxValue()
Преобразует объект Number в значение типа данных xxx и возвращает его.
2 compareTo()
Сравнивает числовой объект с аргументом.
3 equals()
Определяет, равен ли числовой объект аргументу.
4 valueOf()
Возвращает объект Number указанного встроенного типа данных.
5 toString()
Возвращает значение в виде строки.
6 parseInt()
Разбирает строку как тип int.
7 abs()
Возвращает абсолютное значение аргумента.
8 ceil()
Возвращает наименьшее целое число, большее или равное (>=) заданному аргументу, в виде double.
9 floor()
Возвращает наибольшее целое число, меньшее или равное (<=) заданному аргументу.
10 rint()
Возвращает целое число, ближайшее к аргументу. Тип возвращаемого значения — double.
11 round()
Он представляетокругление, алгоритм —Math.floor(x+0.5), то есть прибавить 0.5 к исходному числу и затем округлить вниз. Так, Math.round(11.5) даёт 12, а Math.round(-11.5) даёт -11.
12 min()
Возвращает минимум из двух аргументов.
13 max()
Возвращает максимум из двух аргументов.
14 exp()
Возвращает e (основание натуральных логарифмов), возведённое в степень аргумента.
15 log()
Возвращает натуральный логарифм аргумента.
16 pow()
Возвращает первый аргумент, возведённый в степень второго аргумента.
17 sqrt()
Возвращает арифметический квадратный корень аргумента.
18 sin()
Возвращает синус указанного аргумента типа double.
19 cos()
Возвращает косинус указанного аргумента типа double.
20 tan()
Возвращает тангенс указанного аргумента типа double.
21 asin()
Возвращает арксинус указанного аргумента типа double.
22 acos()
Возвращает арккосинус указанного аргумента типа double.
23 atan()
Возвращает арктангенс указанного аргумента типа double.
24 atan2()
Преобразует декартовы координаты в полярные и возвращает угол полярных координат.
25 toDegrees()
Преобразует аргумент в градусы.
26 toRadians()
Преобразует углы в радианы.
27 random()
Возвращает случайное число.

Сравнение методов floor, round и ceil объекта Math

Параметр Math.floor Math.round Math.ceil
1.4 1 1 2
1.5 1 2 2
1.6 1 2 2
-1.4 -2 -1 -1
-1.5 -2 -1 -1
-1.6 -2 -2 -1

Примеры floor, round и ceil:

public class Main { public static void main(String[] args) { double[] nums = { 1.4, 1.5, 1.6, -1.4, -1.5, -1.6 }; for (double num : nums) { test(num); } } private static void test(double num) { System.out.println("Math.floor(" + num + ")=" + Math.floor(num)); System.out.println("Math.round(" + num + ")=" + Math.round(num)); System.out.println("Math.ceil(" + num + ")=" + Math.ceil(num)); } }

Результат выполнения приведённого выше примера:

Math.floor(1.4)=1.0
Math.round(1.4)=1
Math.ceil(1.4)=2.0
Math.floor(1.5)=1.0
Math.round(1.5)=2
Math.ceil(1.5)=2.0
Math.floor(1.6)=1.0
Math.round(1.6)=2
Math.ceil(1.6)=2.0
Math.floor(-1.4)=-2.0
Math.round(-1.4)=-1
Math.ceil(-1.4)=-1.0
Math.floor(-1.5)=-2.0
Math.round(-1.5)=-1
Math.ceil(-1.5)=-1.0
Math.floor(-1.6)=-2.0
Math.round(-1.6)=-2
Math.ceil(-1.6)=-1.0
Другие расширения