Автор оригинала: 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. Мы рассмотрим конструкторы с примерами кода.
BigDecimal(BigInteger val)
: Он принимает BigInteger в качестве аргумента и создает из него объект BigDecimal.Аналогично, в классе доступны конструкторы, которые принимают int, double, long, char [], а также Сильные в качестве аргумента для создания объекта BigDecimal:
BigDecimal(BigInteger unscaledVal, int масштаб)
: Мы также можем указать масштаб вместе со значением при создании объекта.Выход:
BigDecimal(BigInteger val, MathContext mc)
: Это также дает нам возможность предоставлятьMathContext
экземпляр при создании объекта. В принципе, он обеспечивает точность соответствие формату IEEE 754R. Ниже приведены возможные значения дляjava.math.MathContext
:- Математический контекст.ДЕСЯТИЧНАЯ ЦИФРА 128 ? для обеспечения точности 34 цифры.
- Математический контекст.DECIMAL64 – для обеспечения точности 16 цифр.
- Математический контекст.ДЕСЯТИЧНОЕ ЧИСЛО 32 ? для обеспечения точности 7 цифр.
- Математический контекст.НЕОГРАНИЧЕННО ? чтобы обеспечить неограниченную точность.
Давайте посмотрим на код:
Конечно, он также предоставляет аналогичные конструкторы для int, long, double, char [], а также для строки.
BigDecimal(BigInteger unscaledVal, масштаб int, MathContext mc)
: мы можем обеспечить как масштаб, так и точность во время построения объекта.
Методы Java BigDecimal
Класс Java BigDecimal предоставляет нам несколько методов для выполнения арифметических операций, манипулирования масштабом, округления, сравнения и форматирования.
Обратите внимание, что мы не можем использовать с ним такие операторы, как+,–, поскольку они не перегружены для класса. Вместо этого он предоставляет соответствующие методы для достижения результатов. Давайте рассмотрим методы, представленные в BigDecimal API, с примерами:
|/BigDecimal add(BigDecimal BigDecimal 2)
: Возвращает BigDecimal, значением которого является сложениеэтого
иBigDecimal 2
.Как вы можете видеть, возвращаемый объект из метода add() имеет максимальный масштаб(этот.масштаб, BigDecimal 2). В нашем случае BigDecimal 2 создается с помощью double и принимает значение масштаба из него. Существует также перегруженный
метод add(BigDecimal BigDecimal 2, MathContext mc)
, который принимает точность в качестве аргумента и возвращает объект BigDecimal с округлением в соответствии с настройками контекста.BigDecimal вычитание(BigDecimal BigDecimal 2)
: Возвращает BigDecimal, значение которого равно вычитаниюэтого
иBigDecimal 2
. Аналогично методу add (), он также предоставляет экземпляр MathContext.BigDecimal setScale(int newScale, режим округления, режим округления)
: Очень удобный и мощный метод, который позволяет нам задавать масштаб, а также режим округления объекта. Мы уже обсуждали масштабы. Давайте кратко обсудим режим округления и его возможные значения: Режим округления перечисления обеспечивает следующее возможное округление:- ВВЕРХ: для округления от нуля
- ПОТОЛОК: округлить в сторону положительной бесконечности
- ВНИЗ: округлить до нуля
- ЭТАЖ: округлить в сторону отрицательной бесконечности
- HALF_DOWN: округлить в сторону “ближайшего соседа”, если только оба соседа не находятся на равном расстоянии, и в этом случае округлить в меньшую сторону
- HALF_EVEN: округлить в сторону “ближайшего соседа”, если только оба соседа не находятся на равном расстоянии, и в этом случае округлить в сторону четного соседа
- HALF_UP: округлить в сторону “ближайшего соседа”, если только оба соседа не находятся на равном расстоянии, и в этом случае округлить
- НЕОБЯЗАТЕЛЬНО: утверждать, что запрошенная операция имеет точный результат, следовательно, округление не требуется
Выход:
BigInteger unscaledValue()
: Мы также можем получить значения без масштабирования в любой момент времени. Например, следующий код:достанет нас:
существует также метод
scale ()
, который возвращает масштаб объектаBigDecimal
BigDecimal divide(BigDecimal divisor, int Режим округления)
: Вычисляет делениеэтого
иделителя
и возвращает результат с предоставленным режимом округления.Деление на большие числа(делитель на большие числа, масштаб int, режим округления int)
: Вычисляет делениеэтого
иделителя
и возвращает результат с предоставленным режимом округления и масштабом.Многозначное умножение(многозначное умножение)
: Вычисляет умножениеэтого
имножителя
и возвращает результат.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