Рубрики
Без рубрики

Java BigDecimal

Java BigDecimal, Java BigDecimal прецизионная шкала, сравнение с большим числом, Строка с большим числом, сложение, деление, вычитание, умножение, масштабирование, Строка с большим числом

Автор оригинала: Pankaj Kumar.

Класс Java BigDecimal используется для работы с финансовыми данными. BigDecimal предпочтительнее при работе с высокоточной арифметикой или в ситуациях, требующих более детального контроля над округлением вычислений.

Java BigDecimal

Bigdecimal-это неизменяемые десятичные числа со знаком произвольной точности. Класс Java BigDecimal определен в java.math пакете. Вот иерархия классов BigDecimal:

Java BigDecimal также предоставляет нам удобный контроль над масштабом и точностью . Прежде чем мы рассмотрим класс BigDecimal , мы кратко обсудим точность и масштаб.

Точность и масштаб Java BigDecimal

По определению, точность указывает длину целого числа произвольной точности, тогда как масштаб означает количество цифр справа от десятичной точки. Например, если у нас есть число “100,25”, то точность равна 5, потому что нам нужно пять цифр, чтобы записать это число, а масштаб равен 2.

Мы рассмотрим несколько примеров, чтобы получить четкое представление о точности и масштабе.

9999/10000 = 0.9999, scale = 4 and precision = 4
1/1000 = 0.0001, scale = 4 and precision = 1
0.000, special case and precision = 1

Мы можем установить масштаб для любого BigInteger с помощью конструкторов, а также методов, доступных в API. А пока давайте посмотрим, как это повлияет на количество:

9999 with scale 4 = 0.9999
9999 with scale 1 = 999.9 
9999 with scale -1 = 99990

Мы ясно видим, что это число умножается на 10^-масштаб .

Конструкторы Java BigDecimal

В Java существует несколько способов создания объектов BigDecimal. Мы рассмотрим конструкторы с примерами кода.

  1. BigDecimal(BigInteger val) : Он принимает BigInteger в качестве аргумента и создает из него объект BigDecimal.

    Аналогично, в классе доступны конструкторы, которые принимают int, double, long, char [], а также Сильные в качестве аргумента для создания объекта BigDecimal:

  2. BigDecimal(BigInteger unscaledVal, int масштаб) : Мы также можем указать масштаб вместе со значением при создании объекта.

    Выход:

  3. BigDecimal(BigInteger val, MathContext mc) : Это также дает нам возможность предоставлять MathContext экземпляр при создании объекта. В принципе, он обеспечивает точность соответствие формату IEEE 754R. Ниже приведены возможные значения для java.math.MathContext :

    1. Математический контекст.ДЕСЯТИЧНАЯ ЦИФРА 128 ? для обеспечения точности 34 цифры.
    2. Математический контекст.DECIMAL64 – для обеспечения точности 16 цифр.
    3. Математический контекст.ДЕСЯТИЧНОЕ ЧИСЛО 32 ? для обеспечения точности 7 цифр.
    4. Математический контекст.НЕОГРАНИЧЕННО ? чтобы обеспечить неограниченную точность.

    Давайте посмотрим на код:

    Конечно, он также предоставляет аналогичные конструкторы для int, long, double, char [], а также для строки.

  4. BigDecimal(BigInteger unscaledVal, масштаб int, MathContext mc) : мы можем обеспечить как масштаб, так и точность во время построения объекта.

Методы Java BigDecimal

Класс Java BigDecimal предоставляет нам несколько методов для выполнения арифметических операций, манипулирования масштабом, округления, сравнения и форматирования.

Обратите внимание, что мы не можем использовать с ним такие операторы, как+,–, поскольку они не перегружены для класса. Вместо этого он предоставляет соответствующие методы для достижения результатов. Давайте рассмотрим методы, представленные в BigDecimal API, с примерами:

  1. |/BigDecimal add(BigDecimal BigDecimal 2) : Возвращает BigDecimal, значением которого является сложение этого и BigDecimal 2 .

    Как вы можете видеть, возвращаемый объект из метода add() имеет максимальный масштаб(этот.масштаб, BigDecimal 2). В нашем случае BigDecimal 2 создается с помощью double и принимает значение масштаба из него. Существует также перегруженный метод add(BigDecimal BigDecimal 2, MathContext mc) , который принимает точность в качестве аргумента и возвращает объект BigDecimal с округлением в соответствии с настройками контекста.

  2. BigDecimal вычитание(BigDecimal BigDecimal 2) : Возвращает BigDecimal, значение которого равно вычитанию этого и BigDecimal 2 . Аналогично методу add (), он также предоставляет экземпляр MathContext.

  3. BigDecimal setScale(int newScale, режим округления, режим округления) : Очень удобный и мощный метод, который позволяет нам задавать масштаб, а также режим округления объекта. Мы уже обсуждали масштабы. Давайте кратко обсудим режим округления и его возможные значения: Режим округления перечисления обеспечивает следующее возможное округление:

    1. ВВЕРХ: для округления от нуля
    2. ПОТОЛОК: округлить в сторону положительной бесконечности
    3. ВНИЗ: округлить до нуля
    4. ЭТАЖ: округлить в сторону отрицательной бесконечности
    5. HALF_DOWN: округлить в сторону “ближайшего соседа”, если только оба соседа не находятся на равном расстоянии, и в этом случае округлить в меньшую сторону
    6. HALF_EVEN: округлить в сторону “ближайшего соседа”, если только оба соседа не находятся на равном расстоянии, и в этом случае округлить в сторону четного соседа
    7. HALF_UP: округлить в сторону “ближайшего соседа”, если только оба соседа не находятся на равном расстоянии, и в этом случае округлить
    8. НЕОБЯЗАТЕЛЬНО: утверждать, что запрошенная операция имеет точный результат, следовательно, округление не требуется

    Выход:

  4. BigInteger unscaledValue() : Мы также можем получить значения без масштабирования в любой момент времени. Например, следующий код:

    достанет нас:

    существует также метод scale () , который возвращает масштаб объекта BigDecimal

  5. BigDecimal divide(BigDecimal divisor, int Режим округления) : Вычисляет деление этого и делителя и возвращает результат с предоставленным режимом округления.
  6. Деление на большие числа(делитель на большие числа, масштаб int, режим округления int) : Вычисляет деление этого и делителя и возвращает результат с предоставленным режимом округления и масштабом.
  7. Многозначное умножение(многозначное умножение) : Вычисляет умножение этого и множителя и возвращает результат.
  8. BigDecimal pow(int n) : Возвращает BigDecimal, значение которого равно (это^n), мощность вычисляется точно, с неограниченной точностью.

Обратите внимание, что для каждого метода оператора существует перегруженный метод, который принимает MathContext объект и возвращает выходные данные с соответствующей точностью.

Пример Java BigDecimal

Теперь давайте рассмотрим пример, чтобы проверить приведенные выше методы java BigDecimal:

BigDecimal bigDecimal = new BigDecimal("2255223");
BigDecimal bigDecimal2 = new BigDecimal("55662.3");
System.out.println("Division by specifying rounding mode: " + bigDecimal.divide(bigDecimal2, RoundingMode.CEILING));
System.out.println("Division by specifying scale and rounding mode: "+ bigDecimal.divide(bigDecimal2, 2, RoundingMode.CEILING));
System.out.println("Multiplication: "+bigDecimal.multiply(bigDecimal2));
System.out.println("Power: "+bigDecimal.pow(2));

Выход:

Division by specifying rounding mode: 41
Division by specifying scale and rounding mode: 40.52
Multiplication: 125530899192.9
Power: 5086030779729

В классе BigDecimal предусмотрено множество методов для различных операторов, таких как min () , max() . Кроме того, он предоставляет такие методы, как intValue() , doubleValue() , longValue() для получения выходных данных в требуемом формате.

Форматирование Java BigDecimal

Мы можем использовать api вместе с java.text.NumberFormat , чтобы применить желаемое форматирование к большим числам. Например, предположим, что мы хотим напечатать сумму в долларах США:

BigDecimal bigDecimal = new BigDecimal("225522333333");
System.out.println("Unformatted: " + bigDecimal.toString());
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);
double money = bigDecimal.doubleValue();
String s = n.format(money);
System.out.println("Formatted: "+s);

Выход:

Unformatted: 225522333333
Formatted: $225,522,333,333.00

Java BigDecimal compareTo

Класс Java BigDecimal реализует Сопоставимый интерфейс, и мы должны использовать его метод compareTo для сравнения двух объектов BigDecimal.

Обратите внимание, что два больших десятичных объекта, которые равны по значению, но имеют разный масштаб (например, 10.0 и 10.00), считаются равными методом compareTo.

BigDecimal bd1 = new BigDecimal("100");
BigDecimal bd2 = new BigDecimal("100.00");
BigDecimal bd3 = new BigDecimal("50");
BigDecimal bd4 = new BigDecimal("200");

System.out.println("100 compareTo 100.00 = "+bd1.compareTo(bd2));
System.out.println("100 compareTo 50 = "+bd1.compareTo(bd3));
System.out.println("100 compareTo 200 = "+bd1.compareTo(bd4));

Вывод приведенного выше примера кода сравнения больших чисел является:

100 compareTo 100.00 = 0
100 compareTo 50 = 1
100 compareTo 200 = -1

Java BigDecimal toString

Метод Java BigDecimal toString ведет себя по-разному в зависимости от значения масштаба. Если масштаб равен 6 или более, то он выводится в экспоненциальной системе счисления. Ниже приведен некоторый псевдокод для отображения десятичного значения со шкалой и строкового представления, возвращаемого методом toString.

 [456,0]      "456"
 [-456,0]     "-456"
 [456,-1]     "4.56E+3"
 [456,-3]     "4.56E+5"
 [456,1]      "45.6"
 [456,5]      "0.00456"
 [456,10]     "4.56E-8"
 [-456,12]    "-4.56E-10"

Вот простой пример java для примера BigDecimal toString.

BigDecimal bd1 = new BigDecimal(new BigInteger("10"),10);
System.out.println("BigDecimal(10) with Scale 10 toString = "+bd1);

bd1 = new BigDecimal(new BigInteger("10"),4);
System.out.println("BigDecimal(10) with Scale 4 toString = "+bd1);

Выходные данные, полученные приведенным выше примером кода BigDecimal toString, являются:

BigDecimal(10) with Scale 10 toString = 1.0E-9
BigDecimal(10) with Scale 4 toString = 0.0010

Это все для класса Java BigDecimal.

Ссылка: API Doc