При работе с программами, может возникнуть ситуации, когда обычной точности вычисления с целыми и действительными числами, которые есть по умолчанию в языке программирования Java, нам может быть недостаточно. Именно для этих целей, в языке программирования Java есть специальные возможности, которые сконцентрированы в двух полезных классах, в пакете Java Math, под названием Biglnteger и BigDecimal, которые позволяют оперировать с числами любой точности, состоящими из произвольного количества цифр. Для того чтобы начать рассмотрение этих вопросов, начнем работу с простейшего шаблона нашего приложения, которое выводит одну строчку в стандартное консольное окно. Сохраним этот шаблон в каком-либо файле. Для этого щелкнем на значке сохранения. Создадим папку, введем для нее имя. Пусть будет My8. Далее ведем имя для нашего приложения. Как мы помним, оно должно совпадать с названием класса. Поэтому возьмем опять My-8. Причем первая буква М большая, так же как и в названии класса. И щелкнем на кнопку сохранения.
И теперь мы можем непосредственно начать работу по созданию нашего приложения. Для того чтобы мы могли использовать пакет Java Math, мы должны его импортировать в нашу программу. Для этого в первой строчке нашего приложения напишем таким образом. Import, далее Java, Math и точка с запятой. Теперь решим задачу, связанную с большими числами. Попробуем подсчитать точное количество зерен, которое должен был выдать король древнему шахматисту за его изобретение шахмат.
При этом, как мы помним, на первую клетку нужно положить 1 зерно, далее 2, 4, 8 и т.д. до последней 64 клетки. Для того чтобы это подсчитать, введем две переменные больших чисел целого типа. Этот тип у нас будет BigInteger. Пусть одна переменная будет sum, в не# будем хранить сумму всех зерен на всех досках. Проинициализируем его сначала. Начальное значение пусть будет
0. Для этого мы не можем написать прямо равенство sum и 0, это будет ошибкой. Эта операция не применима к большим числам.
При использовании больших чисел, надо использовать специальные операторы и для сложения, и для вычитания, и даже для присваивания. Поэтому нам просто обычное число 0 надо превратить в большое число. Поэтому напишем таким образом, BigInteger, точка и valueOf. Укажем в скобках число 0, которое нам нужно. Т.е. вот этим оператором BigInteger valueOf конвертировали обычное число 0 в число типа BigInteger. Теперь введем еще одну переменную sumi, в которой будем хранить текущее значение количества зерен на конкретном шахматном поле. Опять нам надо присвоить какое-либо значение, которым воспользуемся. Для этого напишем BigInteger и далее valueOf. И на этот раз проинициализируем его числом 1. Поскольку, как раз с одного зерна все и начиналось. На первой клетке должно быть одно зерно. Далее напишем оператор цикла for. Введем обычную переменную целого типа i1, которая у нас будет меняться от 1 до 64. С приращением единицы. Поэтому напишем i++.
Далее, внутри фигурных скобок напишем то, что у нас должно происходить внутри цикла. А внутри цикла мы проведем, во-первых, суммирование, присвоим нашей переменной sum значение, равное предыдущему его значению плюс число зерен на конкретной шахматной доске и для этого нам надо воспользоваться специальным оператором, который есть в операциях с большими числами. Мы здесь не можем просто написать сумму этих двух переменных. Такая запись выражения недоступна для операций с большими числами, поэтому надо воспользоваться другой записью, которая тут существует. Sum, точка и далее надо воспользоваться специальным оператором Add, добавить, скобка. И вот теперь мы можем написать sumi, текущее значение зерен. ни _ .
I еперь нам надо это выражение sumi
=увеличить в два раза, поскольку на следующей клетке у нас будет зерен в два раза больше, чем на предыдущей.
Поэтому напишем таким образом.
Sumi, знак равенства и, точно так же, как мы не могли воспользоваться простыми операциями в предыдущем случае, здесь мы тоже не можем написать просто умножить на 2. Такая запись неприменима. Поэтому напишем несколько в другом виде. А именно, sumi точка и специальный оператор
multiply, который позволяет умножать на 2, не только на 2, а на любое другое
число. И здесь мы тоже не можем написать внутри скобок просто 2, поскольку число 2 не является большим числом.
Его надо конвертировать в большое число, для чего мы опять воспользуемся вот этой операцией BigInteger valueOf. Для этого проще скопировать вот этот кусочек текста. Правая кнопка мыши, Сору. Далее вставим сюда. Правая кнопка, Paste. Единственное отличие, вместо 1 здесь нам нужно написать 2. Далее закроем скобку, точка с запятой. Теперь попробуем вывести результат на печать. Для этого воспользуемся println. Выделим вот этот кусок текста.
Далее правая кнопка мыши, Сору. Вставим сюда. Правая кнопка, Paste, в скобках напишем sum, знак равенства, плюс и само значение переменной. Закроем скобку, точка с запятой. Скомпилируем теперь эту программу и запустим. Для этого Tools, Compile Java. Далее Tools и Run Java Application. Как видим, при компиляции нам компьютер выдал ошибку. Но в принципе достаточно понятно, что здесь произошло. При написании цикла for, мы около
i не написали 1, поскольку идентификатор у нас i1. Поэтому переключимся на наш текст и припишем здесь недостающую здесь единицу. Теперь скомпилируем опять.
Для этого Tools, Compile Java, Tolls и Run Java Application. На этот раз компиляция прошла успешно, поэтому запустим приложение на выполнение. Можно видеть, сколько зерен на самом деле нужно было выдать. Вот это большое число, которое, конечно же, простым Integer или LongInteger записать невозможно. Можно подсчитать, что здесь используется 20 цифр для записи этого выражения. Закроем теперь наше консольное окно.
⇐Прерывание потока управления. оператор break | TeachPro WEB-дизайн | Большие числа. сравнение. вычисление с большой точностью⇒