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

Недавно я попытался понять использование java.math. MathContext, но отказавший для понимания правильно. Это используется для округления в java.math.BigDecimal. Если да, почему не делает этого вокруг десятичных цифр, но даже части мантиссы.

Из документов API я узнал это, это следует стандарту, указанному в ANSI X3.274-1996 и ANSI X3.274-1996/AM 1-2000 спецификации, но я не заставил их читать онлайн.

Сообщите мне, есть ли у Вас какая-либо идея об этом.

48
задан Ganesh Chowdhary Sadanala 13 August 2018 в 04:41
поделиться

3 ответа

@jatan

спасибо за Вас ответ.Все понятно. Можно ли объяснить меня MathContext в контексте метода BigDecimal#round.

нет ничего специального [приблизительно 112] по сравнению с [1 125] никакой другой BigDecimal метод. Во всех случаях, эти MathContext определяет число значащих цифр и округляющейся техники. В основном существует две части каждого MathContext . Существует точность, и существует также RoundingMode .

точность снова определяет число значащих цифр. Таким образом, если Вы определяете 123 как число и просите 2 значащих цифры, Вы собираетесь добраться 120. Могло бы быть более ясно, думаете ли Вы с точки зрения экспоненциального представления.

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

RoundingMode часть определяет, как мы должны обработать потерю точности. Для многократного использования примера, если Вы используете 123 в качестве числа и просите 2 значащих цифры, Вы уменьшили свою точность. С RoundingMode из [1 116] (режим по умолчанию), 123 станет 120. С RoundingMode из [1 120], Вы доберетесь 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

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

44
ответ дан Derek Park 7 November 2019 в 12:11
поделиться

Если я понимаю Вас правильно, это кажется, что Вы ожидаете, что MathContext будет управлять, сколько цифр должно быть сохранено после десятичной точки. Это не то, для чего это. Это определяет сколько цифр для хранения, общее количество . Таким образом, если Вы определяете желание 3 значащих цифр это - все, что Вы собираетесь получить.

, Например, это:

System.out.println(new BigDecimal("1234567890.123456789",
                   new MathContext(20)));

System.out.println(new BigDecimal("1234567890.123456789",
                   new MathContext(10)));

System.out.println(new BigDecimal("1234567890.123456789",
                   new MathContext(5)));

произведет:

1234567890.123456789
1234567890
1.2346E+9
4
ответ дан Derek Park 7 November 2019 в 12:11
поделиться

Это не для забавы. На самом деле я нашел некоторый пример онлайн, который указал использование MathContext к раунду суммы/числа, сохраненные в BigDecimal.

, Например,

, Если MathContext настроен для имения precision = 2 и rounding mode = ROUND_HALF_EVEN

BigDecimal Number = 0.5294, , округлился к [1 124] 0.53

, Таким образом, я думал, что это - более новая техника и использовало его для округления цели. Однако это превратилось в кошмар, потому что это начало округлять даже часть мантиссы числа.

, Например,

Number = 1.5294 округлен к 1.5

Number = 10.5294, округлен к 10

Number = 101.5294, округлен к [1 110]

.... и так далее

, Таким образом, это не поведение, я ожидал для округления (как точность = 2).

Это, кажется, имеет некоторую логику, потому что от скороговорки я могу сказать, что требуется сначала две цифры (поскольку точность равняется 2) числа, и затем добавляет 0 до нет. из цифр становятся тем же как неокругленная сумма (контроль пример 101,5294...)

4
ответ дан Alasdair 7 November 2019 в 12:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: