Классы BigDecimal и BigInteger в Java
Как правило, Java-программа состоит из методов и переменных, а последние делятся на 2 типа – целые и «вещественные числа». Их различие кроется лишь во вмещаемых значениях. Наиболее значение у класса целых принимает переменная long – от -9223372036854775808 до 9223372036854775807.
В случае с «вещественными числами», наибольший показатель имеет double, который составляет диапазон от 1.7e-308 до 1.7e+308. Однако, что необходимо делать, когда требуется сохранять числа, большие этого значения? Для этого и потребуется использовать BigInteger и BigDecimal, о которых пойдет речь в этой статье.
JavaLanguage – описание пакетов BigDecimal и BigInteger
Сперва стоит разобраться с BigInteger. Этот класс не имеет ограничения в 64 бита, имеет произвольную длину. Данная составляющая кода является наследником Number, как и целые перменные вроде Integer, Double и остальные. Следовательно, данный класс может реализовать методы, приводящие к простым типам:
BigInteger value = new BigInteger(«32145»);
intintValue = value.intValue();//32145
long longValue = value.longValue();//32145
double doubleValue = value.doubleValue();//32145.0
Конструктор у класса BigInteger далеко не один. А потому, можно применять его для разных случаев. Если проще сказать – «На все случаи жизни», так как возможно, возникнет какой угодно сценарий.
Иногда может случаться такое, что простые типы не в состоянии сохранить все данные из BigInteger, ввиду чего произойдет урезание диапазона. Причем примется максимум значения, который доступен для примитивного типа.
Есть также аналоги методов для работы. Их отличие заключается в действиях с типом – если он не вмещает полный диапазон информации с BigInteger, то вбрасывается ArithmeticException.
Касательно констант для BigInteger – стоит выделить несколько таковых:
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
Их значения уже известны из названий. То есть, BigInteger.ZERO – 0, BigInteger.ONE – 1, а BigInteger.TEN – 10.
Основная информация по первому классу разобрана. А значит, стоит перейти к изучению BigDecimal. Здесь, как по названию уже видно, есть что-то общее. А что же это – пользователь сам поймет после прочтения материала далее.
BigDecimal используется уже для замены double. Как правило, применение такого класса нужно во время работы с финансовыми данными. По аналогии с BigInteger, BigDecimal используется для вещественного числа произвольной длины.
BigDecimal также является наследником Number. Возвращаются методы в виде определенного примитивного вида. Выглядит же это таким простым образом в консоли:
BigDecimalvalue=newBigDecimal(35563.3);
LonglongValue=value.longValue();//35563
DoubledoubleValue=value.doubleValue();//35563.3
После запятой в строке с Long отбрасываются все знаки. Потому, программа станет считать целое значение. Об этом и говорится в описании и принадлежности Longк целым переменным.
В случае с конструкторами BigDecimal все более разнообразно. Можно использовать разные средства, к примеру, для задания значения какого-либо объекта. Либо же приготовить параметры создаваемого элемента. Их много, но все они — основные.
Вот самый основной вариант кода:
BigDecimalfirstValue = newBigDecimal(«455656.545»);//455656.545
Здесь было установлено количество символов после запятой(точки). Это, как уже понятно, определяет возможность более точного показа.
BigDecimalsecondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
В конструкции рекомендуется использовать также String. А все обусловлено тем, что Double – неоднозначный тип данных. Значит, точности можно особо не ожидать.
BigDecimalthirdValue = newBigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
Задавая Double, также нужно установить округление. Это необходимо, чтобы избежать запутанных значений, в случае такой необходимости.
char[] arr = new String(«455656.545»).toCharArray();
BigDecimalfourthValue = new BigDecimal(arr, 2, 6);//5656.5
Далее – задается массив знаков, с которого доставляется информация для объекта, а также сколько таковых берется.
BigDecimalfifthValue = new BigDecimal(new BigInteger(«44554»), 3);//44.554
Остается только взять существующий уже класс BigInteger, чтобы установить количество знаков после запятой.
Классы BigInteger и BigDecimal – подробный разбор(методы)
Чтобы подробнее разобраться с обоими классами, стоит приступить к изучению их методов работы. Для каждого их достаточно, чтобы работать без сложностей. Вот, к чему может прибегнуть человек во время взаимодействия с BigInteger:
BigIntegerfirstValue = new BigInteger(«37995»);
BigIntegersecondValue = new BigInteger(«35466»);
BigIntegerresultValue= firstValue.add(secondValue);//73461
Это операции суммирования.
BigIntegerfirstValue = new BigInteger(«37995»);
BigIntegersecondValue = new BigInteger(«35466»);
BigIntegerresultValue= firstValue.multiply(secondValue);//1347530670
Такие действия необходимы для умножения.
BigIntegerfirstValue = new BigInteger(«37995»);
BigIntegersecondValue = new BigInteger(«35466»);
BigIntegerresultValue= firstValue.remainder(secondValue);//2529
С помощью такого кода возможно вычислить остаток при делении чисел друг на друга.
BigIntegerfirstValue = new BigInteger(«-37995»);
BigIntegerresultValue= firstValue.abs();//37995
Такими командами возможно получить модульное число. Оно же не имеет знака. Теперь стоит перейти к более сложным операциям. Их несколько и для изучения может потребоваться больше времени. Однако, в некоторых ситуациях они хорошо помогут. Вот их перечень:
BigIntegerfirstValue = new BigInteger(«-34»);
BigIntegersecondValue = new BigInteger(«5»);
BigIntegerresultValue = firstValue.mod(secondValue); //1
Данный кусок кода позволяет производить вычисление mod. Также, есть вариации данной функции. Вот они:
BigIntegerfirstValue = BigInteger.probablePrime(8, new Random());//211
BigIntegersecondValue = BigInteger.probablePrime(16, new Random());//42571
Это позволит получить случайное число с заданием битности результата. Также, у BigInteger есть операции побитовых сдвигов. Вот оба варианта:
BigIntegerfirstValue = new BigInteger(«5»);
BigIntegerfirstResultValue = firstValue.shiftLeft(3);//40
Это отвечает за сдвиг влево.
BigIntegersecondValue = new BigInteger(«34»);
BigIntegersecondResultValue = secondValue.shiftRight(2); //8
А так возможно произвести сдвиг в правую сторону. Теперь стоит перейти к методам с другим классом – BigDecimal. Его функции отличаются от того же BigInteger тем, что не позволяют настраивать битность, а дополнительно – позволяют настраивать «плавающую» запятую у числа. Вот, что доступно пользователю для работы:
BigDecimal value = new BigDecimal(«454334.34334»);
int result = value.precision();//11
Так можно получить точность(количество чисел);
BigDecimalfirstValue = new BigDecimal(3445.544445);
BigDecimalsecondValue = firstValue.setScale(3,BigDecimal.ROUND_CEILING);//3445.545
Устанавливая такие значения, человек получает возможность округления и отделения чисел до запятой и после нее.
Вот так делается деление одного BigDecimal на другой BigDecimal, а также устанавливается количество чисел после запятой и правило округления получившегося значения:
BigDecimalfirstValue = new BigDecimal(«455656.545»);
BigDecimalsecondValue = new BigDecimal(3445.544445);
BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
Так перемещается запятая на определенное количество цифр вправо или влево:
BigDecimal value = new BigDecimal(«455656.545»);
BigDecimalfirstResult = value.movePointRight (2);//45565654.5
BigDecimalsecondResult = value.movePointLeft (2);//4556.56545
С помощью такой команды можно убрать оставшиеся нули в конце:
BigDecimal value = new BigDecimal(«45056.5000»);
BigDecimal result = value.stripTrailingZeros();//45056.5
Благодаря таким методам и производится работа с обоими классами. Человек может запросто взаимодействовать с ними и легко справляться с разными операциями. И весь материал по обоим классам поможет в работе с кодом с BigInteger и BigDecimal.