В статье блога « Точное преобразование 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, являются их собственными. |