Числовые классы и класс Math в Java
Java Number
Обычно, когда нужны числа, мы обычно используем встроенные типы данных, например:byte、int、long、doubleи т. д.
Пример
Однако в реальной разработке мы часто сталкиваемся с ситуациями, когда требуются объекты вместо встроенных типов данных. Чтобы решить эту проблему, язык Java предоставляет соответствующий класс-обёртку для каждого встроенного типа данных.
Все классы-обёртки(Integer、Long、Byte、Double、Float、Short)являются подклассами абстрактного класса Number.
| Имя класса | Соответствующий примитивный тип | Описание |
|---|---|---|
| Byte | байт | Класс-обёртка Byte |
| Short | short | Класс-обёртка Short |
| Integer | int | Класс-обёртка Integer |
| Long | long | Класс-обёртка Long |
| Float | float | Класс-обёртка Float |
| Double | double | Класс-обёртка Double |
| BigInteger | - | Неизменяемое целое число произвольной точности |
| BigDecimal | - | Неизменяемое знаковое десятичное число произвольной точности |
Такой вид упаковки, специально поддерживаемый компилятором, называется boxing. Поэтому, когда встроенный тип данных используется как объект, компилятор упаковывает встроенный тип в класс-обёртку. Аналогично компилятор может также распаковать объект во встроенный тип.
Класс Number принадлежит пакету java.lang.
Number — абстрактный класс, основное назначение которого — предоставлять унифицированные методы преобразования для различных числовых типов:
Пример
// Абстрактные методы
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:
Результат компиляции и запуска приведенного выше примера выглядит следующим образом:
15
Когда x присваивается целочисленное значение, поскольку x — объект, компилятор упаковывает x. Затем, чтобы x мог выполнить сложение, x нужно распаковать.
Примеры часто используемых методов
Преобразование примитивных типов
Пример
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
Сравнение чисел
Пример
Integer x = 10;
Double y = 10.0;
// Правильный метод сравнения: преобразовать к тому же типу перед сравнением
System.out.println(x.doubleValue() == y.doubleValue()); // true
Специальная обработка чисел
Обработка больших чисел
Пример
BigDecimal bigDec = new BigDecimal("1234567890.1234567890");
// Арифметика больших чисел
BigInteger sum = bigInt.add(new BigInteger("1"));
BigDecimal product = bigDec.multiply(new BigDecimal("2"));
Форматирование чисел
Пример
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:
Результат компиляции и запуска приведенного выше примера выглядит следующим образом:
90 度的正弦值:1.0 0度的余弦值:1.0 60度的正切值:1.7320508075688767 1的反正切值: 0.7853981633974483 π/2的角度值:90.0 3.141592653589793
Расширенные математические операции
1. Экспоненциальные и логарифмические операции
Пример
Math.log(Math.E); // ln(e) = 1
Math.log10(100); // log10(100) = 2
2. Генерация случайных чисел
Пример
double random = Math.random();
// Сгенерировать случайное целое число в диапазоне [1, 100]
int randomInt = (int)(Math.random() * 100) + 1;
3. Другие операции
Пример
Math.IEEEremainder(10, 3); // Остаток IEEE → 1.0
4. Константные поля
Пример
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:
Результат выполнения приведённого выше примера:
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Другие расширения