Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

BigDecimal и BigInteger

Класс java.math.BigDecimal предпочтительнее для работы с финансами вместо double, так как более гибок в настройках. Мне не приходилось использовать класс на практике. Но при создании бухгалтерского софта на него стоит обратить внимание.

Создать BigDecimal из числа типа double просто:


BigDecimal bigDecimal = new BigDecimal(1.5);

Можно создать из строки:


BigDecimal bigDecimal = new BigDecimal("1.5");

Чтобы задать количество цифр после запятой, используйте метод setScale(). Хорошей практикой является одновременное указание вместе с масштабом режима округления с помощью setScale(scale, roundingMode). Режим округления задаёт правило округления числа.


bigDecimal.setScale(2);

Есть восемь вариантов режима округления, которые задаются константами:

ROUND_CEILING: В большую сторону


 0.333  ->   0.34 
-0.333  ->  -0.33

ROUND_DOWN: Отбрасывание разряда


 0.333  ->   0.33 
-0.333  ->  -0.33

ROUND_FLOOR: В меньшую сторону


 0.333  ->   0.33
-0.333  ->  -0.34

ROUND_HALF_UP: Округление вверх, если число после запятой >= .5


0.5  ->  1.0
0.4  ->  0.0

ROUND_HALF_DOWN: Округление вверх, если число после запятой > .5


0.5  ->  0.0
0.6  ->  1.0

ROUND_HALF_EVEN: Округление половины по чётности округляет как обычно. Однако, когда округляемая цифра 5, округление будет идти вниз, если цифра слева от 5 чётная и вверх, если нечётная. Это лучше всего иллюстрируется примером:


BigDecimal a = new BigDecimal("2.5"); // цифра слева от 5 чётная, поэтому округление вниз
BigDecimal b = new BigDecimal("1.5"); // цифра слева от 5 нечётная, поэтому округление вверх

Log.i(TAG, a.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString());// => 2
Log.i(TAG, b.setScale(0, BigDecimal.ROUND_HALF_EVEN).toString());// => 2

ROUND_UNNECESSARY: Используйте ROUND_UNNECESSARY когда необходимо использовать один из методов, который требует ввода режима округления, но известно, что результат округлять не надо.

При делении будьте осторожны и указывайте способ округления в методе divide(). В противном случае можно получить ArithmeticException.

Числа BigDecimal являются неизменными (как String). Это означает, что если создаётся новый объект BigDecimal со значением "2.00", такой объект останется "2.00" и никогда не может быть изменён.

Поэтому методы add(), multiply(), subtract(), divide(), mod() возвращают новый объект BigDecimal, содержащий результат.

Не используйте для сравнения метод equals(), потому что метод будет сравнивать масштабы. Если масштабы различаются. Вместо этого следует использовать методы compareTo() и signum().

Аналогично работайте с классом BigInteger.

BigInteger

Найти наибольшее число из двух при помощи метода max().


BigInteger firstNumber, secondNumber, maxNumber;
firstNumber = new BigInteger("900");
secondNumber = new BigInteger("102");
maxNumber = firstNumber.max(secondNumber);
System.out.println("The maximum value between " + firstNumber + " and " + secondNumber + " is " + maxNumber);
Реклама