Java деление без остатка

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

Хотя работа с ними может показаться немного неуклюжей по сравнению с примитивными типами и их обертками, мы получаем взамен необходимую точность. Теперь давайте рассмотрим все это более подробно. И хотя мы еще не говорили о классах, мне кажется более логичным рассмотреть эти два класса сразу после классов-оберток, чтобы начать понимать, что такое методы классов и как они работают, на примере замены стандартных математических операторов методами этих классов.

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

Чтобы сделать возможным выполнение целочисленных вычислений с любой битовой глубиной, API Java включает класс BigInteger, который хранится в пакете java. Этот класс является потомком java. Number и представляет целые числа произвольной длины, которая не ограничена 64 битами, как в типе long. Поскольку этот класс расширяет класс Number, он переопределяет методы doubleValue , floatValue , intValue , longValue .

Методы byteValue и shortValue не переопределяются, а напрямую наследуются от класса Number. Класс BigInteger содержит методы, дублирующие стандартные арифметические и побитовые операции Java. Методы gcd, modPow, modInverse и isProbablePrime выполняют специальные операции и обычно используются криптографическими и смежными алгоритмами. Класс BigInteger содержит множество других полезных методов, которые мы не будем здесь перечислять, поскольку их достаточно много и они хорошо документированы.

Манипуляции с объектами в классе BigInteger не приводят ни к переполнению, ни к модульному преобразованию. Если результат операции велик, то количество битов просто увеличивается. Числа хранятся в двоичной форме с дополнительным кодом. Шесть конструкторов класса создают объект класса BigInteger из строки символов и цифр знака числа, массива байтов или задают случайное число.

Статический метод valueOf используется для преобразования обычного числа в случайное число с целочисленным литералом или целочисленной переменной, переданной в метод в качестве аргумента. Метод toByteArray преобразует объект в массив байтов. Это далеко не полный список всех методов класса BigInteger. Все остальное можно найти в документации к этому классу.

Следует также отметить, что объекты классов BigInteger и BigDecimal являются неизменяемыми, то есть неизменяемыми. Это означает, что методы этих классов не изменяют значение экземпляра класса, а только возвращают новое. Возможно, сейчас это не совсем понятно, но практика все прояснит. Сейчас мы немного попрактикуемся, чтобы понять, как работать с классом BigInteger. Чтобы использовать класс BigInteger в своей программе, нужно импортировать его командой import, после чего его можно использовать.

И вот заключение этой программы: Класс BigDecimal Примитивные вещественные типы данных, как и целочисленные типы, ограничены количеством цифр, которыми они могут быть представлены. Кроме того, вещественные числа в Java имеют свой большой набор подводных камней, которые не позволяют использовать их в расчетах, требующих точных значений, например, в финансах.

Класс BigDecimal был создан для того, чтобы избежать этих подводных камней и представлять вещественные числа с нужной точностью. Класс Number и представляет числа с плавающей точкой произвольной длины и точности. Класс BigDecimal находится в пакете java. Каждый объект этого класса хранит два целочисленных значения: мантиссу вещественного числа как объект класса BigInteger и неотрицательный десятичный порядок чисел типа int. Например, для числа 76 он будет хранить мантиссу 7 как объект класса BigInteger и порядок 5 как целое число типа int.

Таким образом, мантисса может содержать любое количество цифр, а порядок ограничен значением константы Integer. Класс BigDecimal содержит методы, дублирующие стандартные арифметические операции Java. Но в нем нет методов работы с битами, как в BigInteger. При работе со значениями BigDecimal вы можете явно указать желаемую точность, то есть количество знаков после запятой. Кроме того, при выполнении операции, отбрасывающей биты, например, при делении, вы можете захотеть указать, как округляется первый бит слева от отбрасываемых битов.

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

Класс BigDecimal имеет около 20 конструкторов и множество методов, поэтому мы не будем описывать их все здесь, а просто рассмотрим некоторые из них.

Большинство методов этого класса моделируют операции над вещественными числами. Они возвращают объект класса BigDecimal. Как я уже сказал, здесь перечислены не все методы класса BigDecimal. Остальные можно найти в описании этого класса. Класс BigDecimal в основном используется в финансовых расчетах, так как реальные примитивные типы не подходят для этих целей из-за потери точности, о которой я уже говорил. Но позвольте мне кратко напомнить вам следующий пример: Вывод этого кода выглядит следующим образом: Как видите, результат налицо: никому не понравятся такие вещи в финансах, как double.

Денежные вычисления требуют определенной степени точности, например, двух знаков после запятой для большинства валют. Они также требуют определенного типа поведения при округлении, например, всегда округлять в большую сторону в случае налогов. Например, предположим, у нас есть товар, который стоит Если мы рассчитаем налог на бумагу, то сумма будет: Поскольку точность вычисления для этой валюты составляет два знака после запятой, это требует округления числа 0. Кроме того, поскольку это налог, принято всегда округлять до ближайшего цента.

Таким образом, подсчитав баланс счетов на конец дня, мы никогда не получим недоплату налога. Предположим, что жидкий азот продается по цене 0. Клиент приходит и покупает его. Предположим, что округление происходит по стандартным правилам: если следующая значащая цифра меньше 5, мы округляем в меньшую сторону.

В противном случае округляем в большую сторону. Это дает окончательную цену в виде скидки от числа Какова разница? Расчет 1: Видите разницу в один цент между двумя числами? Первый код не заботился об учете округления, поэтому он всегда выполнял расчет, как в Вычислении 1.

Но во втором коде, прежде чем рассчитать скидки, налоги и все остальное, сначала выполняется округление 2. Это одна из основных причин ошибки в один цент. Из этих примеров должно быть ясно, что необходимы две вещи: 1. Возможность задать масштаб, который представляет собой количество цифр после десятичной точки 2. <Возможность указать метод округления В классе BigDecimal учтены оба этих соображения. Теперь перейдем к округлению. Чтобы задать количество цифр после запятой, используйте метод. Однако хорошей практикой является одновременное указание режима округления и масштаба. Режим округления задает правило округления для числа.

Навигация

thoughts on “Java деление без остатка

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

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