BigInteger a = new BigInteger("99999999999999999"); BigInteger b = new BigInteger("88888888888888888888"); System.out.println("bits in a = " + a.bitLength()); System.out.println("bits in b = " + b.bitLength()); System.out.println("a + b = " + a.add(b)); System.out.println("a & b = " + a.and(b)); System.out.println("a & ~b = " + a.andNot(b)); System.out.println("a / b = " + a.divide(b));
BigInteger[] r = a.divideAndRemainder(b);
System.out.println("a / b: q = " + r[0] + ", r = " + r[1]); System.out.println("gcd(a, b) = " + a.gcd(b)); System.out.println("max(a, b) = " + a.max(b)); System.out.println("min(a, b) = " + a.min(b)); System.out.println("a mod b = " + a.mod(b)); System.out.println("1/a mod b = " + a.modInverse(b)); System.out.println("aAn mod b = " + a.modPow(a, b));
System.out.println("a * b = " + a.multiply(b)); System.out.println("-a = " + a.negate()); System.out.println("~a = " + a.not()); System.out.println("a | b = " + a.or(b)); System.out.println("a л 3 = " + a.pow(3)); System.out.println("a % b = " + a.remainder(b)); System.out.println("a << 3 = " + a.shiftLeft(3)); System.out.println("a >> 3 = " + a.shiftRight(3)); System.out.println("sign(a) = " + a.signum()); System.out.println("a — b = " + a.subtract(b)); System.out.println("a л b = " + a.xor(b));
}
}
Рис. 4.4. Методы класса BigInteger в программе BigIntegerTest |
Обратите внимание на то, что в программу листинга 4.6 надо импортировать пакет
j ava.math.
Класс
Класс BigDecimal расположен в пакете j ava.math. Каждый объект этого класса хранит два целочисленных значения: мантиссу вещественного числа в виде объекта класса BigInteger и неотрицательный десятичный порядок числа типа int. Например, для числа 76,34862 будет храниться мантисса 7 634 862 в объекте класса BigInteger и порядок 5 как целое число типа int. Таким образом, мантисса может содержать любое количество цифр, а порядок ограничен значением константы Integer.MAX_VALUE.
Результат операции над объектами класса BigDecimal округляется по одному из восьми правил, определяемых следующими статическими целыми константами:
□ round_ceiling — округление в сторону большего целого;
□ round_down — округление к нулю, к меньшему по модулю целому значению;
□ round_floor — округление к меньшему целому;
□ round_half_down — округление к ближайшему целому, среднее значение округляется к меньшему целому;
□ round_half_even — округление к ближайшему целому, среднее значение округляется к четному числу;
□ round_half_up — округление к ближайшему целому, среднее значение округляется к большему целому;
□ round_unnecessary — предполагается, что результат будет целым, и округление не понадобится;
□ round_up — округление от нуля, к большему по модулю целому значению.
Три константы — zero, one и ten — моделируют вещественные нуль, единицу и вещественное число десять в операциях с объектами класса BigDecimal.
В классе BigDecimal около двадцати конструкторов. Четыре из них были введены еще в Java 2.
□ BigDecimal (BigInteger bi) - объект будет хранить большое целое bi, порядок равен
нулю;
□ BigDecimal(BigInteger mantissa, int scale) — задается мантисса mantissa и неотрицательный порядок scale объекта; если порядок scale отрицателен, возникает исключительная ситуация;
□ BigDecimal(double d) — объект будет содержать вещественное число удвоенной точности d; если значение d бесконечно или NaN, то возникает исключительная ситуация;
□ BigDecimal (String val) - число задается строкой символов val, которая должна со
держать запись числа по правилам языка Java.
При использовании третьего из перечисленных конструкторов возникает неприятная особенность, отмеченная в документации. Поскольку вещественное число при переводе в двоичную форму представляется, как правило, бесконечной двоичной дробью, то при создании объекта, например BigDecimal (0.1), мантисса, хранящаяся в объекте, окажется очень большой. Она показана на рис. 4.5. Но при создании такого же объекта четвертым конструктором, BigDecimal ("0.1"), мантисса будет равна просто 1.
Остальные конструкторы определяют точность представления числового значения объекта и правила его округления с помощью объекта класса MathContext или непосредственно.
В классе переопределены методы doubleValue (), floatValue (), intValue (), longValue ( ).
Три константы — zero, one и ten — моделируют нуль, единицу и число десять в операциях с объектами класса BigDecimal.
Большинство методов этого класса моделируют операции с вещественными числами. Они возвращают объект класса BigDecimal. Ниже в описании методов буква x обозначает объект класса BigDecimal, буква n — целое значение типа int, буква r — способ округления, одну из восьми перечисленных ранее констант:
□ abs () — абсолютное значение объекта this;
□ add (x) — операция сложения this + x;
□ divide (x, r) — операция деления this / x с округлением по способу r;
□ divide (x, n, r) — операция деления this / x с изменением порядка и округлением по способу r;
□ max(x) — наибольшее из this и x;