Статьи

JDK 8 BigInteger Точные методы сужения преобразования

В статье блога « Точное преобразование Long в Int в Java » я обсуждал использование Math.toIntExact (Long) для точного преобразования Long в int или иначе генерируем ArithmeticException, если это сужающее преобразование невозможно.

Этот метод был введен в JDK 8 , который также представил сходные методы сужающего преобразования для класса BigInteger . Эти методы BigInteger являются темой этого поста.

BigInteger добавил четыре новых «точных» метода в JDK 8:

  • byteValueExact () — преобразует значение BigInteger точно в byte если это возможно
  • shortValueExact () — преобразует значение BigInteger в short если это возможно
  • intValueExact () — преобразует значение BigInteger точно в int если это возможно
  • longValueExact () — преобразует значение BigInteger точно в long если это возможно

Как описано выше, каждый из этих четырех «точных» методов, добавленных в BigInteger с JDK 8, позволяет сузить значение BigInteger до типа данных в имени метода, если это возможно. Поскольку все эти типы ( byte , short , int и long ) имеют меньшие диапазоны, чем BigInteger , в любом из этих случаев возможно иметь значение в BigDecimal со значением, превышающим то, которое может быть представлено любым из этих четырех типов , В таком случае все четыре из этих «точных» методов генерируют исключение ArithmeticException а не «тихо» принудительно увеличивают большее значение в меньшем представлении (которое обычно является бессмысленным числом для большинства контекстов).

Примеры использования этих методов можно найти на GitHub . Когда эти примеры выполняются, вывод выглядит так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
===== Byte =====
125 => 125
126 => 126
127 => 127
128 => java.lang.ArithmeticException: BigInteger out of byte range
129 => java.lang.ArithmeticException: BigInteger out of byte range
===== Short =====
32765 => 32765
32766 => 32766
32767 => 32767
32768 => java.lang.ArithmeticException: BigInteger out of short range
32769 => java.lang.ArithmeticException: BigInteger out of short range
===== Int =====
2147483645 => 2147483645
2147483646 => 2147483646
2147483647 => 2147483647
2147483648 => java.lang.ArithmeticException: BigInteger out of int range
2147483649 => java.lang.ArithmeticException: BigInteger out of int range
===== Long =====
9223372036854775805 => 9223372036854775805
9223372036854775806 => 9223372036854775806
9223372036854775807 => 9223372036854775807
9223372036854775808 => java.lang.ArithmeticException: BigInteger out of long range
9223372036854775809 => java.lang.ArithmeticException: BigInteger out of long range

Добавление этих «точных» методов в BigInteger с JDK 8 приветствуется, поскольку ошибки, связанные с сужением и переполнением чисел, могут быть незначительными. Приятно иметь простой способ получить «точное» сужение, иначе невозможно сделать это сужение, которое становится очевидным через исключение.

Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . Смотрите оригинальную статью здесь: JDK 8 BigInteger Точные методы сужения преобразования

Мнения, высказанные участниками Java Code Geeks, являются их собственными.