Использование java.math.MathContext

@jatan

Спасибо за ответ. Это mathematics имеет смысл. Не могли бы java-se вы объяснить мне MathContext .java в контексте метода BigDecimal#round.

Нет .java ничего особенного в BigDecimal.round() по сравнению с любым math другим методом BigDecimal. Во всех java-libraries случаях MathContext указывает количество arithmetic значащих цифр и метод округления. По math сути, каждый MathContext состоит из mathematical двух частей. Есть точность, а oraclejdk еще есть RoundingMode.

Точность снова mathematical определяет количество значащих bigdecimal цифр. Поэтому, если вы укажете maths 123 в качестве числа и запросите javax две значащие цифры, вы получите java 120. Это может быть яснее, если maths вы думаете с точки зрения arithmetic научной нотации.

123 будет 1.23e2 в core-java экспоненциальном представлении. Если arithmetic оставить только 2 значащие arithmetic цифры, получится 1.2e2 или 120. Уменьшая mathcontext количество значащих цифр, мы java уменьшаем точность, с которой java-se мы можем указать число.

Часть mathematics RoundingMode указывает, как мы должны maths справляться с потерей точности. Чтобы mathematics повторно использовать пример, если maths вы используете 123 в качестве jdk числа и запрашиваете 2 значащие jdk цифры, вы снижаете свою точность. При java-se RoundingMode из HALF_UP (режим по умолчанию) 123 станет mathematical 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

Вы maths можете видеть, что на результат openjdk влияют как точность, так mathematics и режим округления.

java

math

bigdecimal

mathcontext

2022-10-15T02:59:06+00:00