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

@jatan

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

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

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

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

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

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

java

math

bigdecimal

mathcontext

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