Если для решения задачи недостаточно точности основных типов для представления целых и вещественных чисел, можно обратиться к классам Biglnteger и BigDecimal из пакета java.math. Эти классы предназначены для выполнения действий с числами, состоящими из произвольного количества цифр. В классах
Biglnteger и BigDecimal реализуются арифметические операции произвольной точности соответственно для целых и вещественных чисел.
Для преобразования обычного числа в число с произвольной точностью (называемое также большим числом) служит статический метод valueOf ():
Biglnteger а = Biglnteger.valueof(100) ;
К сожалению, над большими числам нельзя выполнять обычные математические операции вроде + или * Вместо этого следует применять методы add () и multiply () из классов соответствующих типов больших чисел, как в приведенном ниже примере кода.
Biglnteger с = a.add(b) ; // с = а + b
Biglnteger d = с.multiply (b. add (Biglnteger. value. Of (2))); // d = с * (b + 2)
НА ЗАМЕТКУ С++! В отличие от С++, перегрузка операций в Java не поддерживается. Поэтому у разработчики класса Biglnteger были лишены возможности переопределить операции + и * для методов add() и multiply (), чтобы реализовать в классе Biglnteger аналоги операций сложения и умножения соответственно. Создатели Java реализовали только перегрузку операции + для обозначения сцепления строк. Они решили не перегружать остальные операции и не предоставили такой возможности программирующим на Java в их собственных классах.
В листинге 3.6 приведен видоизмененный вариант программы из листинга 3.5 для подсчета шансов на выигрыш в лотерее. Теперь эта программа может обращаться с большими числами. Так, если вам предложат сыграть в лотерее, в которой нужно угадать 60 чисел из 490 возможных, эта программа сообщит, что ваши шансы на выигрыш составляют 1 из 7163958434619955574151162225400929334117176127892634 93493351013459481104668848. Желаем удачи!
Программа из листинга 3.5 вычисляла следующее выражение:
lotteryOdds = lottery * (n - i + 1) / i;
Для обработки больших чисел соответствующая строка кода будет выглядеть следующим образом:
lotteryOdds =
lotteryOdds.multiply(Biglnteger.valueOf(n-i+1).divide(Biglnteger.valueOf(i));
Листинг 3.6. Исходный код из файла BiglntegerTest/BiglntegerTest. java
1 import java.math.*;
2 import java.util.*;
3
4 /**
5 * В этой программе используются большие числа для
6 * оценки шансов на выигрыш в л'отерею
7 * (aversion 1.20 2004-02-10
8 * @author Cay Horstmann
9 */
10 public class BiglntegerTest
11 {
12 public static void main(String[] args)
13 {
14 Scanner in = new Scanner(System.in);
15
16 System, out .print ("How many numbers do you need to draw? ");
17 int к = in.nextlnt (); 18
19 System.out.print ("What is the highest number you can draw? ");
20 int n = in.nextlnt (); 21
22 /*
23 * вычислить биномиальный коэффициент по формуле:
25 * n*(n-l)*(n-2)*...Mn-k+l)/(l*2*3*...*k)
25 *
26 */
27
28 Biglnteger lotteryOdds = Biglnteger.valueOf (1); 29
30 for (int i = 1; i <= k; i++)
31 lotteryOdds = lotteryOdds.multiply(Biglnteger.valueOf (
32 n - i + 1)).divide(Biglnteger.valueOf(i));
33
34 System.out.println("Your odds are 1 in " +
35 lotteryOdds + ". Good luck!");
36 }
37 }
java. math. Biglnteger 1.1
• Biglnteger subtract(Biglnteger other)
• '"Biglnteger multiply (Biglnteger other)
• Biglnteger divide(Biglnteger other)
• Biglnteger mod(Biglnteger other)
Возвращают сумму, разность, произведение, частное и остаток от деления, полученные в результате выполнения соответствующих операций над текущим большим числом и значением
переменной other.
• int compareTo(Biglnteger other)
Возвращает 0, если текущее большое число равно значению переменной other, отрицательное число, если это большое число меньше значения переменной other, а иначе — положительное число.
• static Biglnteger valueOf(long x)
Возвращает большое число, равное значению переменной х.
• BigDecimal add(BigDecimal other)
• BigDecimal subtract(BigDecimal other)
• BigDecimal multiply(BigDecimal other)
j ava. math. BigDeclmal 1.1
• BigDecimal divide(BigDecimal other, int roundingMode) 5.0
Возвращают сумму, разность, произведение и частное, полученные в результате соответствующих операций над текущим большим числом и значением переменной other. Чтобы вычислить частное, следует указать режим округления. Режим roundingMode. ROUND_HALF_UP означает округление в сторону уменьшения для цифр 0-4 и в сторону увеличения для цифр 5-9. Для обычных вычислений этого оказывается достаточно. Другие режимы округления описаны в документации.
Если нужно сделать новый и красивый сайт для вашей фирмы, тогда воспользуйтесь услугами студии http://web-gate.org/.
• int compareTo(BigDecimal other)
Возвращает 0, если текущее число типа BigDecimal равно значению переменной other,
отрицательное число, если это число меньше значения переменной other, а иначе — положительное число.
• static BigDecimal valueOf(long x)
• static BigDecimal valueOf(long x, int scale)
Возвращают большое десятичное число, значение которого равно значению переменной х или
x/10scale. |