Изучаем Java

Вы здесь: Главная >> Java-учебник >> Большие числа в Java

Большие числа в Java


Большие числа

Если вам недостаточно точности встроенных целочисленных типов и чисел с плавающей точкой, можно обратиться к двум полезным классам в пакете 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


Партнеры сайта