@ jatan
Спасибо за ответ. Это имеет смысл. Не могли бы вы объяснить мне MathContext в контексте метода BigDecimal # round.
Нет ничего особенного в BigDecimal.round()
против любого другого BigDecimal
метода. Во всех случаях MathContext
указывает количество значащих цифр и метод округления. В основном, есть две части каждого MathContext
. Есть точность, и есть также RoundingMode
.
Точность снова указывает количество значащих цифр. Так что, если вы укажете 123
в качестве числа и попросите 2 значащие цифры, вы получите 120
. Это может быть яснее, если вы думаете с точки зрения научной нотации.
123
будет 1.23e2
в научной записи. Если вы сохраняете только 2 значащие цифры, вы получите 1.2e2
или 120
. Сокращая количество значащих цифр, мы уменьшаем точность, с которой мы можем указать число.
Часть RoundingMode
определяет, как мы должны справляться с потерей точности. Чтобы повторно использовать пример, если вы используете 123
в качестве числа и запрашиваете 2 значащие цифры, вы снизили свою точность. При RoundingMode
из HALF_UP
(режим по умолчанию) 123
станет 120
. С RoundingMode
из CEILING
вы получите 130
.
Например:
System.out.println(new BigDecimal("123.4",
new MathContext(4,RoundingMode.HALF_UP)));
System.out.println(new BigDecimal("123.4",
new MathContext(2,RoundingMode.HALF_UP)));
System.out.println(new BigDecimal("123.4",
new MathContext(2,RoundingMode.CEILING)));
System.out.println(new BigDecimal("123.4",
new MathContext(1,RoundingMode.CEILING)));
Выходы:
123.4
1.2E+2
1.3E+2
2E+2
Вы можете видеть, что как точность, так и режим округления влияют на вывод.