Использование java.math.MathContext
Недавно я пытался понять использование java.math.MathContext, но 9X_maths не смог правильно понять. Используется ли 9X_openjdk он для округления в java.math.BigDecimal
. Если да, то почему 9X_mathcontext он округляет не десятичные цифры, а даже 9X_mathematical часть мантиссы.
Из документов API я узнал, что 9X_javax он соответствует стандарту, указанному в 9X_java-libraries спецификациях ANSI X3.274-1996
и ANSI X3.274-1996/AM 1-2000
, но я не читал их в Интернете.
Пожалуйста, дайте 9X_java-api мне знать, если у вас есть идеи по этому 9X_java-libraries поводу.
Ответ #1
Ответ на вопрос: Использование java.math.MathContext
Чтобы округлить дробную часть BigDecimal, воспользуйтесь 9X_java методом BigDecimal.setScale(int newScale, int roundingMode)
.
Например, для изменения числа с 9X_jre тремя цифрами после десятичной запятой на 9X_mathematical одно с двумя цифрами и округления в большую 9X_java-libraries сторону:
BigDecimal original = new BigDecimal("1.235");
BigDecimal scaled = original.setScale(2, BigDecimal.ROUND_HALF_UP);
Результатом является BigDecimal 9X_openjdk со значением 1,24 (из-за правила округления)
- Это тот ответ, которого хотят люди, работая с фиксированными десятичными числами и сохр ...
Ответ #2
Ответ на вопрос: Использование java.math.MathContext
@jatan
Спасибо за ответ. Это имеет смысл. Не 9X_mathematical могли бы вы объяснить мне MathContext в 9X_mathematical контексте метода BigDecimal#round.
Нет ничего 9X_java-api особенного в BigDecimal.round()
по сравнению с любым другим методом BigDecimal
. Во 9X_mathematical всех случаях MathContext
указывает количество значащих 9X_maths цифр и метод округления. По сути, каждый 9X_bigdecimal MathContext
состоит из двух частей. Есть точность, а 9X_java еще есть RoundingMode
.
Точность снова определяет количество 9X_.java значащих цифр. Поэтому, если вы укажете 9X_maths 123
в качестве числа и запросите две значащие 9X_mathcontext цифры, вы получите 120
. Это может быть яснее, если 9X_.java вы думаете с точки зрения научной нотации.
123
будет 9X_oraclejdk 1.23e2
в экспоненциальном представлении. Если 9X_.java оставить только 2 значащие цифры, получится 9X_jdk 1.2e2
или 120
. Уменьшая количество значащих цифр, мы 9X_oraclejdk уменьшаем точность, с которой мы можем указать 9X_mathcontext число.
Часть RoundingMode
указывает, как мы должны справляться 9X_java с потерей точности. Чтобы повторно использовать 9X_j2se пример, если вы используете 123
в качестве 9X_oraclejdk числа и запрашиваете 2 значащие цифры, вы 9X_jre снижаете свою точность. При RoundingMode
из HALF_UP
(режим 9X_arithmetic по умолчанию) 123
станет 120
. С RoundingMode
из CEILING
вы получите 9X_.java 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
Вы можете видеть, что на 9X_mathematical результат влияют как точность, так и режим 9X_maths округления.
Ответ #3
Ответ на вопрос: Использование java.math.MathContext
Я бы добавил сюда несколько примеров. Я 9X_mathcontext не нашел их в предыдущих ответах, но считаю 9X_java-libraries их полезными для тех, кто может вводить 9X_java-se в заблуждение значащие цифры с количеством десятичных знаков. Предположим, у 9X_mathematics нас есть такой контекст:
MathContext MATH_CTX = new MathContext(3, RoundingMode.HALF_UP);
Для этого кода:
BigDecimal d1 = new BigDecimal(1234.4, MATH_CTX);
System.out.println(d1);
Совершенно 9X_openjdk ясно, что ваш результат - 1.23E+3
, как сказали 9X_mathematics выше ребята. Первые значащие цифры - 123 9X_jre ...
Но что в этом случае:
BigDecimal d2 = new BigDecimal(0.000000454770054, MATH_CTX);
System.out.println(d2);
ваше число не будет округляться до трех знаков после запятой - для 9X_maths кого-то это может быть не интуитивно понятным 9X_bigdecimal и заслуживающим внимания. Вместо этого оно 9X_javax будет округлено до первых трех значащих цифр, которые в данном случае 9X_core-java равны «4 5 4». Таким образом, приведенный 9X_arithmetic выше код приводит к 4.55E-7
, а не к 0.000
, как можно 9X_.java было бы ожидать.
Подобные примеры:
BigDecimal d3 = new BigDecimal(0.001000045477, MATH_CTX);
System.out.println(d3); // 0.00100
BigDecimal d4 = new BigDecimal(0.200000477, MATH_CTX);
System.out.println(d4); // 0.200
BigDecimal d5 = new BigDecimal(0.000000004, MATH_CTX);
System.out.println(d5); //4.00E-9
Надеюсь, этот 9X_javax очевидный, но соответствующий пример будет 9X_java-se вам полезен ...
Ответ #4
Ответ на вопрос: Использование java.math.MathContext
Если я вас правильно понял, похоже, вы ожидаете, что 9X_java-api MathContext будет контролировать, сколько 9X_javax цифр должно оставаться после запятой. Это 9X_mathematics не то, для чего это нужно. Он указывает, сколько 9X_java-se цифр нужно сохранить, всего. Поэтому, если вы 9X_bigdecimal укажете, что вам нужны 3 значащие цифры, это 9X_bigdecimal все, что вы получите.
Например, это:
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
- Спасибо. Как выбрать коли ...
Ответ #5
Ответ на вопрос: Использование java.math.MathContext
Это не для развлечения. На самом деле я 9X_openjdk нашел в Интернете пример, в котором говорилось 9X_mathcontext об использовании MathContext
для округления сумм/чисел, хранящихся 9X_arithmetic в BigDecimal.
Например,
Если MathContext
настроен на 9X_jdk наличие precision = 2
и rounding mode = ROUND_HALF_EVEN
BigDecimal Number = 0.5294
, округляется до 0,53
Поэтому я подумал, что 9X_maths это более новая техника, и использовал ее 9X_java для округления. Однако это превратилось 9X_java-libraries в кошмар, потому что оно начало округлять 9X_mathematical даже ментиссовую часть числа.
Например,
Number = 1.5294
округляется 9X_java-api до 1.5
Number = 10.5294
округляется до 10
Number = 101.5294
округляется до 100
.... и 9X_java-se так далее
Так что это не то поведение, которое 9X_core-java я ожидал для округления (поскольку точность 9X_arithmetic = 2).
Кажется, в этом есть некоторая логика, потому 9X_mathematical что из шаблона я могу сказать, что он берет 9X_java-libraries первые две цифры (поскольку точность равна 9X_javax 2) числа, а затем добавляет 0 до нет. цифр 9X_arithmetic становится таким же, как неокругленная сумма 9X_bigdecimal (оформите пример 101,5294 ...)
- так что вы можете предложить вместо ...
-
14
-
6
-
4
-
4
-
1
-
4
-
5
-
4
-
11
-
10
-
2
-
5
-
4
-
7
-
4
-
7
-
10
-
2
-
8
-
6
-
3
-
6
-
6
-
1
-
8
-
4
-
2
-
3
-
2
-
6
-
4
-
5
-
9
-
2
-
3
-
6
-
2
-
12
-
3
-
3
-
14
-
20
-
4
-
6
-
3
-
3
-
3
-
1
-
4
-
4