@jatan
Спасибо вам ответить. Это имеет смысл. Не могли бы вы объяснить мне MathContext в контексте метода BigDecimal # round.
Там нет ничего особенного BigDecimal.round()
VS. любого другого 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
Вы можете видеть, что как точность и режим округления влияет на выход.
Спасибо. Как я могу выбрать, сколько цифр нужно сохранить после десятичного числа? – Drew 2012-03-07 22:13:17
Это не вопрос BigDecimal. С BigDecimal вы должны указывать количество значащих цифр. Сколько цифр после десятичной точки следует определять при форматировании для отображения. Вы можете управлять этим с помощью String.format() или DecimalFormat.format(). – 2012-03-09 18:48:51
@Drew Я думаю, вы можете использовать [BigDecimal.setScale] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/math/BigDecimal.java# BigDecimal.setScale% 28int% 2Cjava.math.RoundingMode% 29) метод для него. Первый параметр (масштаб) определяет количество чисел, которые вы хотите сохранить после десятичной точки, а второй параметр (roundingMode) определяет требуемое поведение округления. – 2018-01-21 06:59:32