Округление до ближайших сотен тысячных - PullRequest
0 голосов
/ 25 октября 2018

Я столкнулся с проблемой при попытке округлить десятичные разряды числа до ближайшей сотой тысячной цифры.

Пример:

BigDecimal num1 = BigDecimal.valueOf(0.38871551);
MathContext mc = new MathContext(5);
System.out.println(num1.round(mc));

Вывод 0.38872 что и ожидается.Пока все хорошо.Давайте возьмем другой пример:

BigDecimal num1 = BigDecimal.valueOf(1.1680418);
MathContext mc = new MathContext(5);
System.out.println(num1.round(mc));

Вывод 1.1680.Здесь проблема возникает.То, что я хочу, это вывод 1.16804, но округление, кажется, съедает 4 вместо того, чтобы оставить все как есть.

Я пробовал разные режимы округления, но вот что я получаю:

  • RoundMode.UP дает 1.1681
  • RoundingMode.HALF_UP или RoundingMode.HALF_DOWN дает 1.1680 и т. Д.

Как получитьжелаемый результат:

  • 0.38871551 должно округляться до 0.38872
  • 1.1680418 должно округляться до 1.16804
  • 0.55052984 должно округляться до 0.55053

Я даже пытался округлить до 6-го знака после запятой вместо 5-го, но я не могу найти правильную комбинацию, которая дает мне желаемый результат, как показано выше.

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы можете попробовать это с помощью функции setScale BigDecimal

num1 = num1.setScale(5, BigDecimal.ROUND_HALF_UP);
0 голосов
/ 25 октября 2018

MathContext(int) округляет число до такого количества цифр, принимая во внимание целое число, а не только цифры после запятой.

говорят, что вы используете эти числа:

    BigDecimal ten = BigDecimal.valueOf(10.55052984);

    MathContext five = new MathContext(5);
    MathContext two = new MathContext(2);

    System.out.println(ten.round(five));
    System.out.println(ten.round(two));

Он выдаст число, округленное до 5-й или 2-й цифры, независимо от его положения:

10,551
11

Это должно работать:

    BigDecimal num1 = BigDecimal.valueOf(0.38871551);
    System.out.println(num1.setScale(5, RoundingMode.HALF_UP));

    num1 = BigDecimal.valueOf(1.1680418);
    System.out.println(num1.setScale(5, RoundingMode.HALF_UP));

    num1 = BigDecimal.valueOf(0.55052984);
    System.out.println(num1.setScale(5, RoundingMode.HALF_UP));

0.38872
1.16804
0.55053

0 голосов
/ 25 октября 2018

вы можете попробовать таким образом

DecimalFormat df = new DecimalFormat("#.00000");

System.out.print(df.format(1.1680418)); //1.16804
...