Использование 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 поводу.

60
0
5
Общее количество ответов: 5

Ответ #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 (из-за правила округления)

76
1

  • Это тот ответ, которого хотят люди, работая с фиксированными десятичными числами и сохр ...

Ответ #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 округления.

53
0

Ответ #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 вам полезен ...

16
0

Ответ #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
3

  • Спасибо. Как выбрать коли ...

Ответ #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 ...)

5
1

  • так что вы можете предложить вместо ...