Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОПI_ЛР2011_ч3.doc
Скачиваний:
5
Добавлен:
08.11.2019
Размер:
1.42 Mб
Скачать

5.2.3Клас Big Decimal

Клас BigDecimal розташований у пакеті java.math.

Кожний об'єкт цього класу зберігає два цілочисельних значення: мантису дійсного числа у вигляді об'єкту класу BigInteger, і ненегативний десятковий порядок числа типу int.

Наприклад, для числа 76.34862 буде зберігатися мантиса 7634862 в об'єкті класу Biglnteger, і порядок 5 як ціле число типу int. Таким чином, мантиса може містити будь-яку кількість цифр, а порядок обмежений значенням константи integer.MAX_VALUE. Результат операції над об'єктами класу BigDecimal округляється по одному з восьми правил, обумовлених наступними статичними цілими константами:

– ROUND_CEILING – округлення убік більшого цілого;

– ROUND_DOWN – округлення до нуля, до меншого по модулю цілого значенню;

– ROUND_FLOOR – округлення до меншого цілого;

– ROUND_HALF_DOWN – округлення до найближчого цілого, середнє значення округляється до меншого цілого;

– ROUND_HALF_EVEN – округлення до найближчого цілого, середнє значення округляється до парного числа;

– ROOND_HALF_UP – округлення до найближчого цілого, середнє значення округляється до більшого цілого;

– ROUND_UNNECESSARY – припускається, що результат буде цілим, і округлення не знадобиться;

– ROUND_UP – округлення від нуля, до більшого по модулю цілого значенню.

У класі BigDecimal чотири конструктори:

– BigDecimal(Biglnteger bi) – об'єкт буде зберігати велике ціле bi, порядок дорівнює нулю;

– BigDecimal(Biglnteger mantissa, int scale) – задається мантиса mantissa і ненегативний порядок scale об'єкта; якщо порядок scale негативний, виникає виняткова ситуація;

– BigDecimal(double d) – об'єкт буде містити речовинне число подвоєної точності d; якщо значення d нескінченно або Na, те виникає виняткова ситуація;

– BigDecimal(String val) – число задається рядком символів val, де повинен бути запис числа за правилами мови Java.

При використанні третього з перерахованих конструкторів виникає неприємна особливість, відзначена в документації. Оскільки речовинне число при перетворенні у двійкову форму представляється, як правило, нескінченним двійковим дробом, то при створенні об'єкта, наприклад, BigDecimal(0.1), мантиса, що зберігається в об'єкті, виявиться дуже великою. Вона показана на рис. 4.5. Але при створенні такого ж об'єкта четвертим конструктором, BigDecimal("0.1"), мантиса буде дорівнює просто 1.

У Класі перевизначені методи doubleValue(), floatValue(), intValue(), longValue().

Більшість методів цього класу моделюють операції з дійсними числами. Вони повертають об'єкт класу BigDecimal. Тут буква х позначає об'єкт класу BigDecimal, буква n - ціле значення типу int, буква r – спосіб округлення, одну з восьми перерахованих вище констант:

– abs() – абсолютне значення об'єкта this ;

– add(x) – операція this + х ;

– divide(х, r) – операція this / х з округленням за способом r ;

– divide(х, n, r) – операція this / х зі зміною порядку й округленням за способом r ;

– mах(х) – найбільше з this і х ;

– min(x) – найменше з this і х ;

– movePointLeft(n) – зсув вліво на n розрядів;

– movePointRight(n) – зсув вправо на n розрядів;

– multiply(х) – операція this * х ;

– negate() – повертає об'єкт зі зворотним знаком;

– scale() – повертає порядок чисел;

– setscale(n) – встановлює новий порядок n ;

– setscale(n, r) – встановлює новий порядок n і округляє число при необхідності за способом r ;

– signum() – знак числа, що зберігається в об'єкті;

– subtract(х) – операція this - х ;

– toBiginteger() – округлення числа, що зберігається в об'єкті;

unScaledValue() – повертає мантису числа.

Програма 5.3 показує приклади використання цих методів, а рис. 5.4 – вивід результатів.

Рисунок 5.4 – Методи класу BigDecimal у програмі BigDecimalTest

Програма 5.3. Методи класу 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 Biglnteger("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.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.mpvePQintRight(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.toBiglnteger());

System.out.println("mantissa of x = " + x.unscaledValue());

System.out.println("mantissa of 0.1 =\n= " +

new BigDecimal(0.1).unscaledValue()); } }