□ min(x) — наименьшее из this и x;
□ movePointLeft (n) — сдвиг влево на n разрядов;
□ movePointRight(n) — сдвиг вправо на n разрядов;
□ multiply(x) — операция умножения this * x;
□ negate () — возвращает объект с обратным знаком;
□ scale () — возвращает порядок числа;
□ setScale(n) — устанавливает новый порядок n;
□ setScale (n, r) — устанавливает новый порядок n и округляет число при необходимости по способу r;
□ signum () — знак числа, хранящегося в объекте;
□ subtract (x) — операция вычитания this — x;
□ toBiginteger () — округление числа, хранящегося в объекте;
□ unscaledValue () — возвращает мантиссу числа;
□ upl () — возвращает расстояние до следующего числа.
Листинг 4.7 показывает примеры использования этих методов, а рис. 4.5 — вывод результатов.
Начиная с версии Java SE 5 в класс BigDecimal введено еще много методов преобразования объекта и получения его характеристик.
Листинг 4.7. Методы класса BigDecimal в программе BigDecimalTest
import java.math.*; class BigDecimalTest{
public static void main(String[] args){
BigDecimal x = new BigDecimal("-12345.67890123456789");
BigDecimal y = new BigDecimal("345.7896e-4");
BigDecimal z = new BigDecimal(new BigInteger("123456789"), 8); System.out.println("|x| = " + x.abs());
System.out.println("x + y = " + x.add(y));
System.out.println("x / y = " + x.divide(y, BigDecimal.ROUND DOWN)); System.out.println("x / y = " + x.divide(y, 6, BigDecimal.ROUND HALF EVEN)); System.out.println("max(x, y) = " + x.max(y));
System.out.println("min(x, y) = " + x.min(y));
System.out.println("x << 3 = " + x.movePointLeft(3)); System.out.println("x >> 3 = " + x.movePointRight(3)); System.out.println("x * y = " + x.multiply(y)); System.out.println("-x = " + x.negate());
System.out.println("scale of x = " + x.scale());
System.out.println("increase scale of x to 20 = " + x.setScale(20)); System.out.println("decrease scale of x to 10 = " + x.setScale(10, BigDecimal.ROUND HALF UP));
System.out.println("sign(x) = " + x.signum());
System.out.println("x — y = " + x.subtract(y)); System.out.println("round x = " + x.toBigInteger()); System.out.println("mantissa of x = " + x.unscaledValue()); System.out.println("mantissa of 0.1 =\n= " +
new BigDecimal(0.1).unscaledValue());
}
}
Рис. 4.5. Методы класса BigDecimal в программе BigDecimalTest |
Приведем еще один пример. Напишем простенький калькулятор, выполняющий четыре арифметических действия с числами любой величины. Он работает из командной строки. Программа представлена в листинге 4.8, а примеры использования калькулятора — на рис. 4.6.
Листинг 4.8. Простейший калькулятор
import java.math.*; class Calc{
public static void main(String[] args){ if (args.length < 3){
System.err.println("Usage: java Calc operand operator operand"); return;
}
BigDecimal a = new BigDecimal(args[0]);
BigDecimal b = new BigDecimal(args[2]); switch (args[1].charAt(0)){
case | ' + ': |
case | '-': |
case | '*': |
case | ■/': |
default : |
System.out.println(a.add(b)); break;
System.out.println(a.subtract(b)); break; System.out.println(a.multiply(b)); break; System.out.println(a.divide(b,
BigDecimal.ROUND_HAL F_EVEN)); break; System.out.println("Invalid operator");
}
Рис. 4.6. Результаты работы калькулятора |
Почему символ умножения — звездочка — заключен на рис. 4.6 в кавычки? Приверженцам ОС UNIX это понятно, а для других дадим краткое пояснение.
Это особенность операционной системы, а не языка Java. Введенную с клавиатуры строку вначале просматривает командная оболочка (shell) операционной системы, а звездочка для нее — указание подставить на это место все имена файлов из текущего каталога. Оболочка сделает это, и интерпретатор Java получит от нее длинную строку, в которой вместо звездочки стоят имена файлов, отделенные друг от друга пробелом.
Звездочка в кавычках понимается командной оболочкой как обычный символ. Командная оболочка снимает кавычки и передает интерпретатору Java звездочку, что нам и надо.
Класс
Класс Object, стоящий во главе иерархии классов Java, представляет все объекты, действующие в системе, является их общей оболочкой. Всякий объект можно считать экземпляром класса Object.
Класс с именем Class представляет характеристики класса, экземпляром которого является объект. Он хранит информацию о том, не является ли объект на самом деле интерфейсом, массивом, перечислением или примитивным типом, каков суперкласс объекта, каково имя класса, какие в нем конструкторы, поля, методы и вложенные классы.
В классе Class нет конструкторов, экземпляр этого класса создается исполняющей системой Java во время загрузки класса и предоставляется методом getclass () класса Object, например:
String s = "Это строка";
Class c = s.getClass();