Большие числа
Если вам недостаточно точности встроенных целочисленных типов и чисел
с плавающей точкой, можно обратиться к двум полезным классам в пакете
java. math под названием Biglnteger и BigDecimal. Эти классы
предназначены для манипуляций с числами, состоящими из произвольного
количества цифр. Классы Biglnteger и BigDecimal реализуют арифметические
операции произвольной точности для целых и действительных чисел
соответственно.
Для преобразования обычного числа в большое используется статический метод valueOf:
Biglnteger а = Biglnteger.valueof(100);
К сожалению, к большим числам нельзя применять обычные математические операторы + и *. Вместо этого программист должен использовать методы add и multiply из классов для работы с большими числами.
Biglnteger с = a.add(b); // с = a + b Biglnteger d = с.multiply(b.add(Biglnteger.value.Of(2))); // d - с * (b + 2)
В отличие от языка C++, язык Java не поддерживает перегрузку операторов.
Программисты, создававшие класс Biglnteger, были лишены возможности
переопределить операторы + и * для методов add и multiply в классе
Biglnteger. Разработчики языка перегрузили лишь оператор + для
конкатенации строк, решив не перегружать остальные операторы и не дав
возможности остальным программистам на языке Java перегружать операторы
самостоятельно.
В листинге 3.6 показана модификация программы для подсчета шансов
выиграть в лотерее, приведенной в листинге 3.5. Теперь эта программа
может работать с большими числами. Например, если вам предложили сыграть
в лотерее, в которой нужно угадать 60 чисел из 490 возможных, то эта
программа сообщит вам, что шанс выиграть равен 1 из 716395843461995557415116222540092933411717612789263493493351013459481104668848. Удачи!
Программа, представленная в листинге 3.5, вычисляла следующий оператор:
lotteryOdds = lottery * (n - i + 1) / i;
При работе с большими числами эквивалентный оператор выглядит так. lotteryOdds = lotteryOdds.multiply(Biglnteger.valueOf(n-i+1) .divide(Biglnteger.valueOf(i));
Листинг 3.5. Программа BiglntegerTest.java
API: java.math.BigInteger 1.1 - Biglnteger add(Biglnteger other) - 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 vaiueOf(long x) Возвращает большое число, значение которого равно значению переменной х.
API: java.mathBigDecimal 1.1 - BigDecimal add (BigDecimal other) - BigDecimal subtract (BigDecimal other) - BigDecimal multiply (BigDecimal other) - BigDecimal divide (BigDecimal other, int roundingMode)
Возвращает сумму, разность, произведение и частное от деления большого
десятичного числа на значение переменной other. Чтобы вычислить частное,
нужно поддерживать режим округления. Режим BigDecimal. ROUND HALF
UP означает обычное округление (т.е. в сторону уменьшения, если
последняя цифра меньше 5, и в сторону увеличения, если она больше 5).
Для обычных вычислений этого достаточно. Другие режимы округления
описаны в документации по интерфейсу API.
- int compareTo(BigDecimal other) Возвращает 0, если данное число
типа BigDecimal равно значению переменной other, отрицательное число,
если данное число меньше значения переменной other, и положительное
число в противном случае.
- static BigDecimal vaiueOf (long x) - static BigDecimal vaiueOf (long x, int scale)
Возвращает большое десятичное число, значение которого равно значению переменной х или х/10scale
|