Введение
Java включает класс BigDecimal для выполнения высокоточных арифметических операций, которые можно использовать в приложениях, основанных на банковской или финансовой сфере. Этот класс примерно вписывается в ту же категорию, что и классы-оболочки, но имеет несколько очень полезных методов.
В этом классе есть методы, которые предоставляют аналоги для операций, которые вы выполняете с примитивными типами. То есть вы можете делать с BigDecimal все, что можете с int или float, просто вы должны использовать вызовы методов вместо операторов. Кроме того, поскольку задействовано больше, операции будут выполняться медленнее. Вы меняете скорость на точность.
BigDecimal предназначен для чисел произвольной точности с фиксированной запятой; вы можете использовать их для точных денежных расчетов. Ниже в коде Java объясняется концепция точности вычислений. Одна часть выполняет все вычисления с использованием double, а другая часть выполняет вычисления с использованием BigDecimal. Вывод показывает разницу между ними.
Код Java: Перейдите в редактор
import java. math.BigDecimal; открытый класс BigDecimalDemo {public static void main (String [] argv) {System.out.println ("--- Обычная печать -----"); 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 -----"); System.out.println (новый BigDecimal ("2.00"). Subtract (новый BigDecimal ("1.1"))); System.out.println (новый BigDecimal ("2.00"). Subtract (новый BigDecimal ("1.2"))); System.out.println (новый BigDecimal ("2.00"). Subtract (новый BigDecimal ("1.3"))); System.out.println (новый BigDecimal ("2.00"). Subtract (новый BigDecimal ("1.4"))); System.out.println (новый BigDecimal ("2.00"). Subtract (новый BigDecimal ("1.5"))); System.out.println (новый BigDecimal ("2.00"). Subtract (новый BigDecimal ("1.6"))); System.out.println (новый BigDecimal ("2.00"). Subtract (новый BigDecimal ("1.7"))); BigDecimal bd1 = новый 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 (double d) | Принимает примитив двойного типа для создания нового объекта BigDecimal |
BigDecimal (double val, MathContext mc) | Преобразует double в BigDecimal с округлением в соответствии с настройками контекста. |
BigDecimal (String s) | Принимает объект String для создания нового объекта BigDecimal (может вызвать исключение формата числа, если передана нечисловая строка) |
BigDecimal (String val, MathContext mc) | Преобразует строковое представление BigDecimal в BigDecimal, принимая те же строки, что и конструктор BigDecimal (String), с округление в соответствии с настройками контекста. |
BigDecimal (int i) | Принимает примитив типа int для создания нового объекта BigDecimal |
BigDecimal (int v al, MathContext mc) | Преобразует int в BigDecimal с округлением в соответствии с настройками контекста. |
BigDecimal (char [] c) | Принимает массив символов в качестве аргумента для создания объекта 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 (long val) | Преобразует длинное число в BigDecimal. |
BigDecimal (long val, MathContext mc) | Преобразует длинное число в BigDecimal с округлением в соответствии с настройками контекста. |
Важные методы BigDecimal
Имя метода | Описание |
---|---|
abs ( ) | Возвращает BigDecimal, значение которого является абсолютным значением этого BigDecimal. |
abs (MathContext mc) | Возвращает BigDecimal, значение которого является абсолютным значением этого BigDecimal, с округлением в соответствии с настройками контекста. |
add (BigDecimal augend) | Возвращает BigDecimal, значение которого (this + augend), а масштаб — max (this.scale (), augend.scale ()). |
add (BigDecimal augend, MathContext mc) | Возвращает BigDecimal, значение которого (this + augend), с округлением в соответствии с в настройки контекста. |
byteValueExact () | Преобразует этот BigDecimal в байт, проверяя потерянную информацию. |
compareTo (BigDecimal val) | Сравнивает этот BigDecimal с указанным BigDecimal. |
div (BigDecimal divisor) | Возвращает BigDecimal, значение которого (this/divisor), если точное частное не может быть представлено (поскольку оно имеет неограниченное десятичное раскрытие), исключение ArithmeticException выбрасывается. |
div (BigDecimal divisor, int roundingMode) | Возвращает BigDecimal, значение которого (this/divisor), и чей масштаб — this.scale (). |
div (BigDecimal divisor, int scale, int roundingMode) | Возвращает BigDecimal, значение которого (this/divisor) и масштаб соответствует указанному. |
div (BigDecimal divisor, int scale, RoundingModeroundingMode) | Возвращает BigDecimal, значение которого (this/divisor) и масштаб соответствует указанному. |
div (BigDecimal divisor, MathContext mc) | Возвращает BigDecimal, значение которого (this/divisor), с округлением в соответствии с настройками контекста. |
div (BigDecimal divisor, RoundingModeroundingMode) | Возвращает BigDecimal, значение которого (this/divisor), а масштаб — this.scale () . |
DivideAndRemainder (BigDecimal divisor) | Возвращает двухэлементный массив BigDecimal, содержащий результат divToIntegralValue, за которым следует результат остаток от двух операндов. |
divAndRemainder (BigDecimal divisor, MathContext mc) | Возвращает двухэлементный массив BigDecimal, содержащий результат divToIntegralValue, за которым следует результат остатка по двум операндам, вычисленный с округлением в соответствии с контекстом xt. |
DivideToIntegralValue (BigDecimal divisor) | Возвращает BigDecimal, значение которого является целой частью частного (this/ divisor) с округлением в меньшую сторону. |
diverToIntegralValue (BigDecimal divisor, MathContext mc) | Возвращает BigDecimal, значение которого является целой частью (this/divisor). |
doubleValue () | Преобразует этот BigDecimal в double. |
equals (Object x) | Сравнивает этот BigDecimal с указанным объектом на равенство. |
floatValue () | Преобразует этот BigDecimal в число с плавающей запятой. |
hashCode () | Возвращает хэш-код для этого 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 позиций вправо. |
multiply (BigDecimal multip ) | Возвращает BigDecimal, значение которого (this × multip) и масштаб (this.scale () + multiplicand.scale ()). |
multiply (BigDecimal multiplicand, MathContext mc) | Возвращает BigDecimal, значение которого (это умножаемое ×), с округлением в соответствии с настройками контекста. |
negate () | Возвращает BigDecimal, значение которого (-this), а масштаб — this.scale (). |
negate (MathContext mc) | Возвращает BigDecimal, значение которого равно (-this), с округлением в соответствии с настройками контекста. |
plus () | Возвращает BigDecimal, значение которого равно (+ this), а масштаб — this.scale (). |
plus (MathContext mc) | Возвращает BigDecimal, значение которого равно (+ this), с округлением в соответствии с настройками контекста. |
pow (int n) | Возвращает BigDecimal, значение которого (thisn), мощность вычисляется точно с неограниченной точностью. |
pow (int n, MathContext mc) | Возвращает BigDecimal, значение которого равно (thisn). |
precision () | Возвращает точность этого BigDecimal. |
остаток (BigDecimal делитель) | Возвращает BigDecimal, значение которого (этот% делитель). |
Рема inder (BigDecimal divisor, MathContext mc) | Возвращает BigDecimal, значение которого (this% divisor), с округлением в соответствии с настройками контекста. |
round (MathContext mc) | Возвращает BigDecimal, округленное в соответствии с настройками MathContext. |
scale () | Возвращает масштаб этого BigDecimal. |
scaleByPowerOfTen (int n) | Возвращает BigDecimal, числовое значение которого равно (this * 10n). |
setScale (int newScale) | Возвращает BigDecimal, масштаб которого является указанным значением, и значение которого численно равно этому BigDecimal. |
setScale (int newScale, int roundingMode) | Возвращает BigDecimal, масштаб которого является указанным значением, и немасштабированное значение которого определяется путем умножения или деления немасштабированного значения BigDecimal на соответствующую степень десяти, чтобы сохранить его общее значение.. |
setScale (int newScale, RoundingModeroundingMode) | Возвращает BigDecimal, масштаб которого является указанным значением, и чье немасштабированное значение определено умножив или разделив немасштабированное значение BigDecimal на соответствующую степень десяти, чтобы сохранить его общее значение. |
shortValueExact () | Преобразует этот BigDecimal в короткий, проверяя потерянную информацию. |
signum () | Возвращает функцию signum этого BigDecimal . |
stripTrailingZeros () | Возвращает BigDecimal, который численно равен этому, но с любыми конечными нулями, удаленными из представления . |
subtract (BigDecimal subtrahend) | Возвращает BigDecimal, значение которого (this — subtrahend), а масштаб — max (this.scale (), subtrahend.scale ()). |
subtract (BigDecimal subtrahend, MathContext mc) | Возвращает BigDecimal, значение которого (это — вычитание), с округлением в соответствии с настройками контекста. |
toBigInteger () | Преобразует это BigDecimal в BigInteger. |
toBigIntegerExact () | Преобразует это BigDecimal в BigInteger, проверяя наличие утерянной информации. |
toEngineeringString () | Возвращает строковое представление этого BigDecimal с использованием инженерной нотации, если требуется экспонента. |
toPlainString () | Возвращает строковое представление этого BigDecimal без поля экспоненты. |
ulp () | Возвращает размер ulp, единицы на последнем месте этого BigDecimal. |
unscaledValue () | Возвращает BigInteger, значение которого является немасштабированным значением этого BigDecimal. |
Ограничение числа до определенной степени точности
Допустим, мы хотели бы вычислить что-то с точностью до трех знаков после запятой, не больше и не меньше, и независимо ndent числа, которое мы использовали для создания экземпляра 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: if xy
Код Java: перейдите в редактор
import java.math.BigDecimal; открытый класс 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 по сравнению с b =" + a.compareTo (b)); System.out.println ("a по сравнению с c =" + a.compareTo ( c)); System.out.println ("b по сравнению с a =" + b.compareTo (a)); System.out.println ("b по сравнению с c =" + b.compareTo (c)); System. out.println ("c по сравнению с a =" + c.compareTo (a)); Sy stem.out.println ("c по сравнению с b =" + c.compareTo (b)); }}
Вывод:
Резюме:
- Класс BigDecimal следует использовать, когда нам нужна точность и определенный масштаб в наши результаты.
- BigDecimal похож на другие классы-оболочки, имеющие определенные методы для сложения, вычитания, умножения и деления.
- Операции этого класса-оболочки немного медленнее по сравнению с примитивными типами.
Редактор кода Java: