кодесурса

Java BigDecimal Class

script1adsense2code
script1adsense3code

Вступление

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

Этот класс имеет методы, которые предоставляют аналоги для операций, которые вы выполняете с примитивными типами. То есть вы можете делать с BigDecimal все, что можете, с помощью int или float, просто вы должны использовать вызовы методов вместо операторов. Кроме того, поскольку они более сложны, операции будут выполняться медленнее. Вы меняете скорость на точность.

BigDecimal для чисел с фиксированной точкой произвольной точности; Вы можете использовать их для точных денежных расчетов. Ниже Java-код объясняет понятие точности в расчетах. Одна часть выполняет все вычисления с использованием double, а другая часть выполняет вычисления с использованием BigDecimal. Вывод показывает разницу между ними.

Java-код: перейти к редактору

import java.math.BigDecimal;
public class BigDecimalDemo {
	public static void main(String[] argv) {		 
		  System.out.println("--- Normal Print-----");
		  System.out.println(2.00 - 1.1);
		  System.out.println(2.00 - 1.2);
		  System.out.println(2.00 - 1.3);
		  System.out.println(2.00 - 1.4);
		  System.out.println(2.00 - 1.5);
		  System.out.println(2.00 - 1.6);
		  System.out.println(2.00 - 1.7);
		  System.out.println("--- BigDecimal Usage Print-----");
		  System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.1")));
		  System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.2")));
		  System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.3")));
		  System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.4")));
		  System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.5")));
		  System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.6")));
		  System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.7")));	
		  BigDecimal bd1 = new BigDecimal ("1234.34567");
		 bd1= bd1.setScale (3, BigDecimal.ROUND_CEILING);     
		  System.out.println(bd1);
	}
}

Выход:


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

Тип конструкции использование
BigDecimal (BigIntegerval) Принимает аргумент BigInteger для создания нового значения BigDecimal
BigDecimal (BigIntegerunscaledVal, int scale) Переводит значение BigIntegerunscaled и масштаб int в BigDecimal.
BigDecimal (BigIntegerunscaledVal, int scale, MathContext mc) Переводит значение BigIntegerunscaled и масштаб int в BigDecimal с округлением в соответствии с настройками контекста.
BigDecimal (BigIntegerval, MathContext mc) Переводит BigInteger в округление BigDecimal в соответствии с настройками контекста.
BigDecimal (двойной d) Принимает двойной тип примитива для создания нового объекта BigDecimal
BigDecimal (double val, MathContext mc) Переводит double в BigDecimal с округлением в соответствии с настройками контекста.
BigDecimal (String s) Принимает объект String для создания нового объекта BigDecimal (может выдать исключение формата числа, если передана нечисловая строка)
BigDecimal (Строка val, MathContext mc) Переводит строковое представление BigDecimal в BigDecimal, принимая те же строки, что и конструктор BigDecimal (String), с округлением в соответствии с настройками контекста.
BigDecimal (int i) Принимает примитив типа int для создания нового объекта BigDecimal
BigDecimal (int val, MathContext mc) Переводит int в BigDecimal с округлением в соответствии с настройками контекста.
BigDecimal (char [] c) Принимает массив char в качестве аргумента для создания объекта BigDecimal.
BigDecimal (char [] in, int offset, int len) Преобразует представление массива символов BigDecimal в BigDecimal, принимая ту же последовательность символов, что и конструктор BigDecimal (String), в то же время позволяя указать подмассив.
BigDecimal (char [] in, int offset, int len, MathContext mc) Переводит представление массива символов BigDecimal в BigDecimal, принимая ту же последовательность символов, что и конструктор BigDecimal (String), в то же время позволяя указывать подмассив и с округлением в соответствии с настройками контекста.
BigDecimal (char [] in, MathContext mc) Переводит представление массива символов BigDecimal в BigDecimal, принимая ту же последовательность символов, что и конструктор BigDecimal (String), и с округлением в соответствии с настройками контекста.
BigDecimal (длинный вал) Переводит длинный в BigDecimal.
BigDecimal (long val, MathContext mc) Переводит long в BigDecimal с округлением в соответствии с настройками контекста.

BigDecimal важные методы

Название метода Описание
абс () Возвращает BigDecimal, значение которого является абсолютным значением этого BigDecimal.
abs (MathContext MC) Возвращает BigDecimal, значение которого является абсолютным значением этого BigDecimal, с округлением в соответствии с настройками контекста.
добавить (BigDecimal augend) Возвращает BigDecimal, значение которого (this + augend), а масштаб которого max (this.scale (), augend.scale ()).
добавить (BigDecimal augend, MathContext mc) Возвращает BigDecimal, значение которого (this + augend), с округлением в соответствии с настройками контекста.
byteValueExact () Преобразует этот BigDecimal в байт, проверяя потерянную информацию.
compareTo (BigDecimal val) Сравнивает этот BigDecimal с указанным BigDecimal.
делить (BigDecimal делитель) Возвращает BigDecimal, значение которого (this / divisor), если точный фактор не может быть представлен (поскольку он имеет бесконечное десятичное расширение), генерируется исключение ArithmeticException.
делить (делитель BigDecimal, int roundingMode) Возвращает BigDecimal со значением (this / divisor) и масштабом this.scale ().
делить (делитель BigDecimal, масштаб int, int roundingMode) Возвращает BigDecimal, значение которого (this / divisor), и масштаб которого соответствует указанному.
делить (делитель BigDecimal, масштаб int, RoundingModeroundingMode) Возвращает BigDecimal, значение которого (this / divisor), и масштаб которого соответствует указанному.
делить (делитель BigDecimal, MathContext mc) Возвращает BigDecimal, значение которого (this / divisor), с округлением в соответствии с настройками контекста.
делить (делитель BigDecimal, RoundingModeroundingMode) Возвращает BigDecimal со значением (this / divisor) и масштабом this.scale ().
divAndRemainder (делитель BigDecimal) Возвращает двухэлементный массив BigDecimal, содержащий результат DivToIntegralValue, за которым следует результат остаток от двух операндов.
divAndRemainder (делитель BigDecimal, MathContext mc) Возвращает двухэлементный массив BigDecimal, содержащий результат DivToIntegralValue, за которым следует результат остатка по двум операндам, вычисленным с округлением в соответствии с настройками контекста.
divToIntegralValue (делитель BigDecimal) Возвращает BigDecimal, значение которого представляет собой целую часть отношения (this / divisor), округленного в меньшую сторону.
divToIntegralValue (делитель BigDecimal, MathContext mc) Возвращает BigDecimal, значение которого является целочисленной частью (this / divisor).
doubleValue () Преобразует этот BigDecimal в двойной.
равно (объект х) Сравнивает этот BigDecimal с указанным объектом на равенство.
floatValue () Преобразует этот BigDecimal в число с плавающей точкой.
хэш-код() Возвращает хеш-код для этого BigDecimal.
intValue () Преобразует этот BigDecimal в int.
intValueExact () Преобразует этот BigDecimal в int, проверяя потерянную информацию.
longValue () Преобразует этот BigDecimal в длинный.
longValueExact () Преобразует этот BigDecimal в long, проверяя потерянную информацию.
max (BigDecimal val) Возвращает максимум этого BigDecimal и val.
min (BigDecimal val) Возвращает минимум этого BigDecimal и val.
movePointLeft (int n) Возвращает BigDecimal, который эквивалентен этому с десятичной точкой, сдвинутой на n мест влево.
movePointRight (int n) Возвращает BigDecimal, который эквивалентен этому с десятичной точкой, сдвинутой на n позиций вправо.
умножить (BigDecimal multip) Возвращает BigDecimal, значение которого (this × multip) и масштаб которого (this.scale () + multiplicand.scale ()).
умножение (BigDecimal multiplicand, MathContext mc) Возвращает BigDecimal, значение которого (this × multiplicand), с округлением в соответствии с настройками контекста.
свести на нет () Возвращает BigDecimal со значением (-this) и масштабом this.scale ().
отрицать (MathContext MC) Возвращает BigDecimal, значение которого (-this), с округлением в соответствии с настройками контекста.
плюс () Возвращает BigDecimal со значением (+ this) и масштабом this.scale ().
плюс (MathContext MC) Возвращает BigDecimal, значение которого (+ this), с округлением в соответствии с настройками контекста.
Pow (Int N) Возвращает BigDecimal, значение которого (thisn). Мощность вычисляется точно с неограниченной точностью.
pow (int n, MathContext mc) Возвращает BigDecimal, значение которого (thisn).
точность () Возвращает точность этого BigDecimal.
остаток (делитель BigDecimal) Возвращает BigDecimal, значение которого равно (этот% делитель).
остаток (BigDecimal делитель, MathContext mc) Возвращает BigDecimal, значение которого (это% делитель), с округлением в соответствии с настройками контекста.
круглый (MathContext MC) Возвращает BigDecimal, округленное в соответствии с настройками MathContext.
масштаб() Возвращает масштаб этого BigDecimal.
scaleByPowerOfTen (int n) Возвращает BigDecimal, числовое значение которого равно (это * 10n).
setScale (int newScale) Возвращает BigDecimal, масштаб которого является указанным значением, и значение которого численно равно этому BigDecimal.
setScale (int newScale, int roundingMode) Возвращает BigDecimal, масштаб которого является указанным значением, и немасштабированное значение определяется путем умножения или деления немасштабированного значения этого BigDecimal на соответствующую степень десяти, чтобы сохранить его общее значение.
setScale (int newScale, RoundingModeroundingMode) Возвращает BigDecimal, масштаб которого является указанным значением, и немасштабированное значение определяется путем умножения или деления немасштабированного значения этого BigDecimal на соответствующую степень десяти, чтобы сохранить его общее значение.
shortValueExact () Преобразует этот BigDecimal в короткий, проверяя потерянную информацию.
сигнум () Возвращает функцию signum этого BigDecimal.
stripTrailingZeros () Возвращает BigDecimal, который численно равен этому, но с любыми конечными нулями, удаленными из представления.
вычитать (BigDecimal вычитать) Возвращает BigDecimal, значение которого (this - вычитаемое), а масштаб которого max (this.scale (), subtrahend.scale ()).
вычитать (вычитание BigDecimal, MathContext mc) Возвращает BigDecimal, значение которого (this - вычитаемое), с округлением в соответствии с настройками контекста.
toBigInteger () Преобразует этот BigDecimal в BigInteger.
toBigIntegerExact () Преобразует этот BigDecimal в BigInteger, проверяя потерянную информацию.
toEngineeringString () Возвращает строковое представление этого BigDecimal, используя инженерные обозначения, если необходим показатель степени.
toPlainString () Возвращает строковое представление этого BigDecimal без поля экспоненты.
ОТП () Возвращает размер ulp, единицы на последнем месте, этого BigDecimal.
unscaledValue () Возвращает BigInteger, значением которого является немасштабированное значение этого BigDecimal.

Ограничение числа до определенной степени точности

Допустим, мы хотели бы вычислить что-то, до 3 десятичных знаков, не больше и не меньше, и независимо от числа, которое мы использовали для создания экземпляра BigDecimal. В этом случае нам нужно будет указать два свойства объекта BigDecimal. Режим округления и шкала. Масштаб определяет количество десятичных разрядов, которое мы хотим, а режим округления определяет, как мы хотим округлить число с плавающей запятой. В качестве примера, мы изменим задачу выше следующим образом:

«После того, как вы создали программу, ваши начальники в НАСА изменили свое мнение, и теперь они хотят, чтобы результат был точным с точностью до 3 десятичных знаков. Теперь вам нужно изменить свою программу».

 BigDecimal bd1 = новый BigDecimal ("1234.34567");
bd1 = bd1.setScale (3, BigDecimal.ROUND_CEILING);     
System.out.println (BD1);    

Выход будет 1234,346

Сравнение BigDecimals

Как и в случае с примитивными числовыми типами данных, иногда необходимо сравнивать BigDecimals друг с другом. Для этого нужно использовать метод "x.compareTo (BigDecimal bd)". (Примечание. Не используйте метод .equals (). Это распространенная ошибка, так как он сравнивает два указателя, чтобы определить, указывают ли они на один и тот же объект, и не имеет ничего общего с числовым равенством).

Метод compareTo работает следующим образом: допустим, мы делаем вызов «x.compareTo (y)». Результатом этого вызова будет: (как в сопоставимом интерфейсе)

 -1: если х <у
 0: если х == у 
+1: если х> у    

Java-код: перейти к редактору

import java.math.BigDecimal;
public class BigDecimalCompare {
	 public static void main(String[]args){
         BigDecimal a = new BigDecimal("31234"); 
         BigDecimal b = new BigDecimal("31234.00");
         BigDecimal c = new BigDecimal("-21234");
         System.out.println("a compared to b ="+a.compareTo(b)); 
         System.out.println("a compared to c ="+a.compareTo(c)); 
         System.out.println("b compared to a ="+b.compareTo(a)); 
         System.out.println("b compared to c ="+b.compareTo(c));
         System.out.println("c compared to a ="+c.compareTo(a)); 
         System.out.println("c compared to b ="+c.compareTo(b)); 
        
    }
}

Выход:


Резюме:

  • Класс BigDecimal следует использовать, когда нам нужны точность и особый масштаб в наших результатах.
  • BigDecimal похож на другие классы-обертки, имеющие специальные методы для сложения, вычитания, умножения и деления.
  • Операции этого класса-обёртки немного медленнее по сравнению с примитивными типами.

Редактор кода Java:

Предыдущая: Сборка мусора на Java

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code