Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 строки».
Предыдущая статья — «Java 8 перечисления».
Содержание статьи:
- java.lang.Number
- Классы Byte, Short, Integer, Long, Float, Double
- java.math.BigInteger
- java.math.BigDecimal
- java.lang.Math
java.lang.Number
Классы Byte, Short, Integer, Long, Float, Double
Для каждого примитивного типа существует класс, позволяющий представить этот тип в объекте. Все такие классы, соответствующие числам, наследуются от абстрактного класса java.lang.Number и находятся в пакете java.lang.
Классы для числовых примитивных типов:
- Класс Byte соответствует примитивному типу byte.
- Класс Short соответствует примитивному типу short.
- Класс Integer соответствует примитивному типу int.
- Класс Long соответствует примитивному типу long.
- Класс Float соответствует примитивному типу float.
- Класс Double соответствует примитивному типу double.
Все эти классы неизменяемые, то есть не могут менять своего состояния после создания, что позволяет безопасно использовать их в нескольких потоках.
В большинстве случаев можно использовать примитивный тип там, где ожидается объект, и объект там, где ожидается примитивный тип. В таких случаях компилятор Java автоматически вставляет преобразование из примитива в объект и обратно. Это преобразование называется автоупаковкой (Autoboxing) и распаковкой (unboxing). Подробнее читайте в статье «Java 8 автоупаковка и распаковка».
1 2 |
Integer i1 = 3334; // Упаковка int в объект Integer int i2 = i1; // Распаковка Integer в примитивный тип int |
Каждый из этих классов содержит константы MAX_VALUE и MIN_VALUE , которые позволяют узнать максимально возможное и минимально возможное число для соответствующего примитивного типа:
1 2 3 4 |
System.out.println("Byte.MIN_VALUE=" + Byte.MIN_VALUE); System.out.println("Byte.MAX_VALUE=" + Byte.MAX_VALUE); System.out.println("Integer.MIN_VALUE=" + Integer.MIN_VALUE); System.out.println("Integer.MAX_VALUE=" + Integer.MAX_VALUE); |
Классы java.lang.Double и java.lang.Float дополнительно содержат константы NaN (не число), NEGATIVE_INFINITY (минус бесконечность), POSITIVE_INFINITY (плюс бесконечность), MIN_EXPONENT (минимальная экспонента) и MAX_EXPONENT (максимальная экспонента), MIN_NORMAL (наименьшее положительное число, которое может хранить этот тип).
Абстрактный класс Number содержит несколько полезных методов, которые реализуются всеми его дочерними классами.
Методы для конвертации объекта Number в соответствующее число примитивного типа:
1 2 3 4 5 6 |
byte byteValue() short shortValue() int intValue() long longValue() float floatValue() double doubleValue() |
Методы сравнения с примитивными типами:
1 2 3 4 5 6 |
int compareTo(Byte anotherByte) int compareTo(Double anotherDouble) int compareTo(Float anotherFloat) int compareTo(Integer anotherInteger) int compareTo(Long anotherLong) int compareTo(Short anotherShort) |
Метод проверки на равенство:
1 |
boolean equals(Object obj) |
Метод проверки на равенство возвращает true тогда, когда obj не равен null , и тип obj совпадает с типом объекта, у которого вызван метод, и они содержат одинаковое значение.
Каждый из классов Byte , Short , Integer , Long , Float , Double также содержит методы для конвертации чисел в строку и из строки. Пример для класса Integer (остальные классы содержат аналогичные методы для своих типов):
1 |
static Integer decode(String s) |
Конвертирует строку в число. Поддерживает десятичную, шестнадцатеричную и восьмеричную системы счисления.
1 |
static int parseInt(String s) |
Возвращает int . Только для десятичной системы счисления.
1 |
static int parseInt(String s, int radix) |
Возвращает int . Система счисления задаётся параметром radix (2, 8, 10 или 16).
1 |
String toString() |
Возвращает строковое представление.
1 |
static String toString(int i) |
Возвращает строковое представление для i .
1 |
static Integer valueOf(int i) |
Возвращает объект Integer , содержащий значение i . Рекомендуется для получения объектов из соответствующих им примитивов всегда использовать этот метод и аналогичные в других классах, поскольку они кэшируют часто используемые значения. Метод public static Byte valueOf(byte b) кэширует ВСЕ значения. Методы public static Short valueOf(short s) и public static Integer valueOf(int i) всегда кэшируют значения от -128 до +127 включительно и часто используемые. Методы public static Long valueOf(long l) , public static Float valueOf(float f) и public static Double valueOf(double d) кэшируют часто используемые значения.
1 |
static Integer valueOf(String s) |
Возвращает объект Integer , содержащий значение из строки.
1 |
static Integer valueOf(String s, int radix) |
Возвращает объект Integer , содержащий разобранное значение из строки s в соответствии с системой счисления radix .
java.math.BigInteger
Класс java.math.BigInteger позволяет хранить целые числа любой величины. Объекты этого класса являются неизменямыми, то есть не меняют своего состояния после создания, но могут порождать новые объекты при сложении, вычитании и т. д., что означает, что их можно безбоязненно использовать в нескольких потоках.
Класс java.math.BigInteger является потомком класса java.lang.Number .
Пример создания:
1 |
BigInteger bigNumber1 = new BigInteger("1000000000000000000000000000"); |
Здесь был использован конструктор, принимающий строку. У BigInteger есть ещё другие конструкторы, то это наиболее часто используемый.
Логика операций с BigInteger схожа с логикой целочисленный операций в Java. Например, деление на 0 приводит к ArithmeticException .
Переполнение как в целочисленных операциях примитивов в BigInteger невозможно, так как он автоматически занимает столько места, чтобы поместить результат операции.
Операции побитовых сдвигов для BigInteger расширены — они могут принимать отрицательное расстояние. Сдвиг вправо с отрицательным расстоянием приводит к сдвигу влево и т. д. Беззнакового сдвига вправо для BigInteger нет, так как он не имеет смысла при неограниченном размере числа.
В Java нет перегрузки операций, поэтому для выполнения арифметических операций с BigInteger нужно использовать методы.
Список методов:
1 |
public BigInteger abs() |
Возвращает BigInteger с положительным знаком и тем же числом.
1 |
public BigInteger negate() |
Возвращает BigInteger с отрицательным знаком и тем же значением.
1 |
public int signum() |
Возвращает -1 для отрицательных чисел, 0 для нуля и 1 для положительных.
1 |
public BigInteger shiftLeft(int n) |
Возвращает результат побитового сдвига влево на n позиций.
1 |
public BigInteger shiftRight(int n) |
Возвращает результат побитового сдвига вправо на n позиций.
1 |
public int compareTo(BigInteger val) |
Сравнивает значение в BigInteger со значением в val . Возвращает -1, если текущее значение меньше val , 0 если они равны, и 1, если текущее значение больше val .
1 |
public BigInteger add(BigInteger val) |
Возвращает результат сложения текущего BigInteger с val .
1 |
public BigInteger subtract(BigInteger val) |
Возвращает разность текущего значения и val .
1 |
public BigInteger multiply(BigInteger val) |
Возвращает результат умножения текущего значения на val .
1 |
public BigInteger divide(BigInteger val) throws ArithmeticException |
Возвращает результат целочисленного деления текущего значения на val . Если val равен нулю, то возникает ArithmeticException .
1 |
public BigInteger remainder(BigInteger val) throws ArithmeticException |
Возвращает остаток от деления текущего значения на val . Если val равен нулю, то возникает ArithmeticException .
и другие методы, включая методы из Number.
Пример использования:
1 2 3 4 |
BigInteger bigNumber1 = new BigInteger("1000000000000000000000000000"); BigInteger result = bigNumber1.add(new BigInteger("123")) .subtract(new BigInteger("333")) .multiply(new BigInteger("2")); |
java.math.BigDecimal
Неизменяемое десятичное число произвольной точности. BigDecimal состоит из целочисленного числа произвольного размера и 32-х битного коэффициента масштабирования ( scale), который показывает, на сколько позиций нужно сдвинуть десятичную точку.
Фактическое значение, хранящееся в BigDecimal получается по формуле unscaled value × 10-scale, то есть положительное значение scale определяет количество цифр, на которое нужно сдвинуть десятичную запятую влево, а отрицательное scale определяет количество нулей, которые нужно добавить к целому unscaled value, чтобы получить конечное значение.
Класс java.math.BigDecimal является потомком класса java.lang.Number.
Для хранения и обработки денежных значений нужно всегда использовать BigDecimal, так как он позволяет избежать ошибок округления, которые возникают из-за невозможности представить некоторые десятичные дроби без потери точности в float и double .
1 |
BigDecimal value1 = new BigDecimal("100.01"); |
Для многих методов в BigDecimal нужно указать экземпляр класса java.math.MathContext, который определяет точность результирующего значения и способ округления или scale и способ округления. У некоторых методов есть варианты без MathContext и с ним, а также со scale и без него, в этом случае нужно всегда использовать вариант либо MathContext, либо со scale, так как методы без этого параметра будут генерировать ArithmeticException, если их результат невозможно представить конечной десятичной дробью.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 4 значащие цифры // Стандартное округление, которому учат в школе. MathContext mathContext = new MathContext(4, RoundingMode.HALF_UP); BigDecimal result1 = new BigDecimal("100").divide( new BigDecimal("3"), mathContext); BigDecimal result2 = new BigDecimal("100").divide( new BigDecimal("3"), 4, RoundingMode.HALF_UP); System.out.println("result1 = " + result1); // 33.33 (4 значащие цифры) System.out.println("result2 = " + result2); // 33.3333 (4 цифры // после запятой) |
В Java нет перегрузки операций, поэтому для арифметический операций с BigDecimal нужно использовать соответствующие методы.
Рекомендую ознакомиться с особенностями работы с java.math.BigDecimal в Java.
Список полезных методов:
1 |
public BigDecimal abs() |
Возвращает положительный BigDecimal со значением равным текущему (без знака).
1 |
public BigDecimal negate() |
Возвращает значение с противоположным знаком.
1 |
public int signum() |
Возвращает знак числа (-1, 0 или 1).
1 |
public int scale() |
Возвращает коэффициент масштабирования scale согласно формуле:
текущее значение = целое_число * 10 -scale
1 |
public int compareTo(BigDecimal val) |
Сравнивает текущее значение с val . Возвращает -1, если текущее значение меньше val , 0 — текущее значение равно val , 1 — текущее значение больше val. Всегда сравнивайте значения BigDecimal через compareTo, а не через equals, так как метод equals сравнивает ещё scale-ы (коэффициент масштабирования или количество чисел после запятой для случая положительного scale), поэтому для equals выражение new BigDecimal("100.0").equals(new BigDecimal("100.00")) вернёт false, поскольку у new BigDecimal("100.0") количество цифр после запятой ( scale) равно 1, а у new BigDecimal("100.00") оно равно 2.
1 |
public BigDecimal add(BigDecimal augend) throws ArithmeticException |
Возвращает результат сложения текущего значения и augend. Коэффициент масштабирования scale результата равен max(this.scale(), augend.scale()).
1 |
public BigDecimal subtract(BigDecimal subtrahend) throws ArithmeticException |
Возвращает разность текущего значения и subtrahend. Коэффициент масштабирования scale результата равен max(this.scale(), subtrahend.scale()).
1 |
public BigDecimal multiply(BigDecimal multiplicand) throws ArithmeticException |
Возвращает результат умножения текущего значения на multiplicand. Коэффициент масштабирования результата равен this.scale + multiplicand.scale().
1 2 |
public BigDecimal divide(BigDecimal divisor, MathContext mc) throws ArithmeticException |
Возвращает результат деления текущего значения на divisor. Количество значащих цифр в результате берётся из mc.
1 2 3 |
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) throws ArithmeticException |
Возвращает результат деления текущего значения на divisor. Коэффициент масштабирование ( scale или количество цифр после десятичной запятой) результата равен переданному scale.
1 2 |
public BigDecimal remainder(BigDecimal divisor, MathContext mc) throws ArithmeticException |
Возвращает остаток от деления текущего значения на divisor .
и другие методы, включая методы из java.lang.Number .
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
BigDecimal value1 = new BigDecimal("100.01"); // 4 значащие цифры // Стандартное округление, которому учат в школе. MathContext mathContext = new MathContext(4, RoundingMode.HALF_UP); BigDecimal result1 = value1.add(new BigDecimal("2"), mathContext) .subtract(new BigDecimal("0.001"), mathContext); System.out.println(result1); // 102.0 (4 значащие цифра, как в mathContext. BigDecimal result2 = value1.add(new BigDecimal("2")) .subtract(new BigDecimal("0.001")); System.out.println(result2); // 102.009 (scale=3, так как это максимальный // который задался в операции subtract |
java.lang.Math
Класс java.lang.Math содержит некоторые предопределённые константы и методы, позволяющие вычислять синус, косинус, возводить в степень и т. д.
Константы:
1 |
public static final double E = 2.7182818284590452354; |
Основание натурального логарифма.
1 |
public static final double PI = 3.14159265358979323846; |
Число . Отношение длины окружности к длине её диаметра.
Методы:
1 |
public static double sin(double a) |
Возвращает синус угла a . Угол задаётся в радианах.
1 |
public static double cos(double a) |
Возвращает косинус угла a . Угол задаётся в радианах.
1 |
public static double tan(double a) |
Возвращает тангенс угла a . Угол задаётся в радианах.
1 |
public static double asin(double a) |
Возвращает арксинус угла a . Угол задаётся в радианах.
1 |
public static double acos(double a) |
Возвращает арккосинус угла a . Угол задаётся в радианах.
1 |
public static double atan(double a) |
Возвращает арктангенс угла a . Угол задаётся в радианах.
1 |
public static double log(double a) |
Возвращает натуральный логарифм угла a . Угол задаётся в радианах.
1 |
public static double sqrt(double a) |
Возвращает квадратный корень от a .
1 2 |
public static double pow(double a, double b) |
Возвращает a возведённое в степень b .
1 |
public static long round(double a) |
Возвращает округлённое значение a .
и другие методы.
Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 строки».
Предыдущая статья — «Java 8 перечисления».
В примере 2 раза упоминается min, вместо min и max:
System.out.println(«Integer.MIN_VALUE=» + Integer.MIN_VALUE);
System.out.println(«Integer.MIN_VALUE=» + Integer.MIN_VALUE);
Поправил, спасибо.