В статье блога « Точное преобразование 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 => 125126 => 126127 => 127128 => java.lang.ArithmeticException: BigInteger out of byte range129 => java.lang.ArithmeticException: BigInteger out of byte range===== Short =====32765 => 3276532766 => 3276632767 => 3276732768 => java.lang.ArithmeticException: BigInteger out of short range32769 => java.lang.ArithmeticException: BigInteger out of short range===== Int =====2147483645 => 21474836452147483646 => 21474836462147483647 => 21474836472147483648 => java.lang.ArithmeticException: BigInteger out of int range2147483649 => java.lang.ArithmeticException: BigInteger out of int range===== Long =====9223372036854775805 => 92233720368547758059223372036854775806 => 92233720368547758069223372036854775807 => 92233720368547758079223372036854775808 => java.lang.ArithmeticException: BigInteger out of long range9223372036854775809 => java.lang.ArithmeticException: BigInteger out of long range |
Добавление этих «точных» методов в BigInteger с JDK 8 приветствуется, поскольку ошибки, связанные с сужением и переполнением чисел, могут быть незначительными. Приятно иметь простой способ получить «точное» сужение, иначе невозможно сделать это сужение, которое становится очевидным через исключение.
| Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . Смотрите оригинальную статью здесь: JDK 8 BigInteger Точные методы сужения преобразования
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |