Java 8 числа

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 строки».
Предыдущая статья — «Java 8 перечисления».

Содержание статьи:

  1. java.lang.Number
  2. Классы Byte, Short, Integer, Long, Float, Double
  3. java.math.BigInteger
  4. java.math.BigDecimal
  5. java.lang.Math

java.lang.Number

Классы Byte, Short, Integer, Long, Float, Double

Для каждого примитивного типа существует класс, позволяющий представить этот тип в объекте. Все такие классы, соответствующие числам, наследуются от абстрактного класса java.lang.Number и находятся в пакете java.lang.

Классы для числовых примитивных типов:

  1. Класс Byte  соответствует примитивному типу byte.
  2. Класс Short  соответствует примитивному типу short.
  3. Класс Integer  соответствует примитивному типу int.
  4. Класс Long  соответствует примитивному типу long.
  5. Класс Float  соответствует примитивному типу float.
  6. Класс Double  соответствует примитивному типу double.

Все эти классы неизменяемые, то есть не могут менять своего состояния после создания, что позволяет безопасно использовать их в нескольких потоках.

В большинстве случаев можно использовать примитивный тип там, где ожидается объект, и объект там, где ожидается примитивный тип. В таких случаях компилятор Java автоматически вставляет преобразование из примитива в объект и обратно. Это преобразование называется автоупаковкой (Autoboxing) и распаковкой (unboxing). Подробнее читайте в статье «Java 8 автоупаковка и распаковка».

Каждый из этих классов содержит константы MAX_VALUE  и MIN_VALUE , которые позволяют узнать максимально возможное и минимально возможное число для соответствующего примитивного типа:

Классы java.lang.Double  и java.lang.Float  дополнительно содержат константы NaN  (не число), NEGATIVE_INFINITY  (минус бесконечность), POSITIVE_INFINITY  (плюс бесконечность), MIN_EXPONENT  (минимальная экспонента) и MAX_EXPONENT  (максимальная экспонента), MIN_NORMAL  (наименьшее положительное число, которое может хранить этот тип).

Абстрактный класс Number  содержит несколько полезных методов, которые реализуются всеми его дочерними классами.

Методы для конвертации объекта Number  в соответствующее число примитивного типа:

Методы сравнения с примитивными типами:

Метод проверки на равенство:

Метод проверки на равенство возвращает true  тогда, когда obj  не равен null , и тип obj  совпадает с типом объекта, у которого вызван метод, и они содержат одинаковое значение.

 

Каждый из классов Byte , Short , Integer , Long , Float , Double  также содержит методы для конвертации чисел в строку и из строки. Пример для класса Integer (остальные классы содержат аналогичные методы для своих типов):

 

Конвертирует строку в число. Поддерживает десятичную, шестнадцатеричную и восьмеричную системы счисления.

 

 

Возвращает int . Только для десятичной системы счисления.

 

Возвращает int . Система счисления задаётся параметром radix (2, 8, 10 или 16).

 

Возвращает строковое представление.

 

Возвращает строковое представление для 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) кэшируют часто используемые значения.

 

Возвращает объект Integer , содержащий значение из строки.

 

Возвращает объект Integer , содержащий разобранное значение из строки  s  в соответствии с системой счисления radix .

java.math.BigInteger

Класс java.math.BigInteger позволяет хранить целые числа любой величины. Объекты этого класса являются неизменямыми, то есть не меняют своего состояния после создания, но могут порождать новые объекты при сложении, вычитании и т. д., что означает, что их можно безбоязненно использовать в нескольких потоках.

Класс java.math.BigInteger  является потомком класса java.lang.Number .

Пример создания:

Здесь был использован конструктор, принимающий строку. У BigInteger  есть ещё другие конструкторы, то это наиболее часто используемый.

Логика операций с BigInteger  схожа с логикой целочисленный операций в Java. Например, деление на 0 приводит к ArithmeticException .

Переполнение как в целочисленных операциях примитивов в BigInteger  невозможно, так как он автоматически занимает столько места, чтобы поместить результат операции.

Операции побитовых сдвигов для BigInteger  расширены — они могут принимать отрицательное расстояние. Сдвиг вправо с отрицательным расстоянием приводит к сдвигу влево и т. д. Беззнакового сдвига вправо для BigInteger  нет, так как он не имеет смысла при неограниченном размере числа.

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

Список методов:

 

Возвращает BigInteger  с положительным знаком и тем же числом.

 

Возвращает BigInteger  с отрицательным знаком и тем  же значением.

 

Возвращает -1 для отрицательных чисел, 0 для нуля и 1 для положительных.

 

Возвращает результат побитового сдвига влево на n  позиций.

 

Возвращает результат побитового сдвига вправо на n  позиций.

 

Сравнивает значение в BigInteger  со значением в val . Возвращает -1, если текущее значение меньше val , 0 если они равны, и 1, если текущее значение больше val .

 

Возвращает результат сложения текущего BigInteger  с val .

 

Возвращает разность текущего значения и val .

 

Возвращает результат умножения текущего значения на val .

 

Возвращает результат целочисленного деления текущего значения на val . Если val  равен нулю, то возникает ArithmeticException .

 

Возвращает остаток от деления текущего значения на val . Если val  равен нулю, то возникает ArithmeticException .

 

и другие методы, включая методы из Number.

 

Пример использования:

 

java.math.BigDecimal

Неизменяемое десятичное число произвольной точности. BigDecimal состоит из целочисленного числа произвольного размера и 32-х битного коэффициента масштабирования ( scale), который показывает, на сколько позиций нужно сдвинуть десятичную точку.

Фактическое значение, хранящееся в BigDecimal получается по формуле unscaled value × 10-scale, то есть положительное значение scale  определяет количество цифр, на которое нужно сдвинуть десятичную запятую влево, а отрицательное scale  определяет количество нулей, которые нужно добавить к целому unscaled value, чтобы получить конечное значение.

Класс java.math.BigDecimal  является потомком класса java.lang.Number.

Для хранения и обработки денежных значений нужно всегда использовать BigDecimal, так как он позволяет избежать ошибок округления, которые возникают из-за невозможности представить некоторые десятичные дроби без потери точности в float  и double .

Для многих методов в BigDecimal  нужно указать экземпляр класса java.math.MathContext, который определяет точность результирующего значения и способ округления или scale и способ округления. У некоторых методов есть варианты без MathContext  и с ним, а также со scale и без него, в этом случае нужно всегда использовать вариант либо MathContext, либо со scale, так как методы без этого параметра будут генерировать ArithmeticException, если их результат невозможно представить конечной десятичной дробью.

В Java нет перегрузки операций, поэтому для арифметический операций с BigDecimal  нужно использовать соответствующие методы.

Рекомендую ознакомиться с особенностями работы с java.math.BigDecimal в Java.

Список полезных методов:

 

Возвращает положительный BigDecimal со значением равным текущему (без знака).

 

Возвращает значение с противоположным знаком.

 

Возвращает знак числа (-1, 0 или 1).

 

Возвращает коэффициент масштабирования scale согласно формуле:

текущее значение = целое_число * 10 -scale

 

Сравнивает текущее значение с 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.

 

Возвращает результат сложения текущего значения и augend. Коэффициент масштабирования scale  результата равен max(this.scale(), augend.scale()).

 

Возвращает разность текущего значения и subtrahend. Коэффициент масштабирования scale  результата равен max(this.scale(), subtrahend.scale()).

 

Возвращает результат умножения текущего значения на multiplicand. Коэффициент масштабирования результата равен this.scale + multiplicand.scale().

 

Возвращает результат деления текущего значения на divisor. Количество значащих цифр в результате берётся из mc.

 

Возвращает результат деления текущего значения на divisor. Коэффициент масштабирование ( scale  или количество цифр после десятичной запятой) результата равен переданному scale.

 

Возвращает остаток от деления текущего значения на divisor .

 

и другие методы, включая методы из java.lang.Number .

 

Пример использования:

 

 

java.lang.Math

Класс java.lang.Math содержит некоторые предопределённые константы и методы, позволяющие вычислять синус, косинус, возводить в степень и т. д.

Константы:

 

Основание натурального логарифма.

 

Число \pi~. Отношение длины окружности к длине её диаметра.

 

Методы:

Возвращает синус угла a . Угол задаётся в радианах.

 

Возвращает косинус угла a . Угол задаётся в радианах.

 

Возвращает тангенс угла a . Угол задаётся в радианах.

 

Возвращает арксинус угла a . Угол задаётся в радианах.

 

Возвращает арккосинус угла a . Угол задаётся в радианах.

 

Возвращает арктангенс угла a . Угол задаётся в радианах.

 

Возвращает натуральный логарифм угла a . Угол задаётся в радианах.

 

Возвращает квадратный корень от  a .

 

Возвращает a  возведённое в степень b .

 

Возвращает округлённое значение a .

 

и другие методы.

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 строки».
Предыдущая статья — «Java 8 перечисления».

Java 8 числа: 2 комментария

  1. В примере 2 раза упоминается min, вместо min и max:
    System.out.println(«Integer.MIN_VALUE=» + Integer.MIN_VALUE);
    System.out.println(«Integer.MIN_VALUE=» + Integer.MIN_VALUE);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *