@джатан
Спасибо за ответ. Это имеет смысл. Не могли бы вы объяснить мне MathContext в контексте метода BigDecimal#round.
В BigDecimal.round()
по сравнению с любым другим BigDecimal
методом нет ничего особенного. Во всех случаях MathContext
указывает количество значащих цифр и метод округления. По сути, каждый MathContext
а>. Есть точность, а есть RoundingMode
а>.
Точность снова указывает количество значащих цифр. Поэтому, если вы укажете 123
в качестве числа и запросите две значащие цифры, вы получите 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
Вы можете видеть, что и точность, и режим округления влияют на результат.
person
Derek Park
schedule
11.08.2008