Java BigDecimal Class
Вступление
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 программирования