Java BigDecimal: Как установить масштаб, только если он превышает определенную точку точности? - PullRequest
1 голос
/ 06 мая 2019

У меня есть сценарий использования, в котором я хочу установить масштаб, только если точность числа больше определенного числа. Другими словами, я хочу установить масштаб на 4, если точность равна 5, но оставить значение, как оно есть, если точность меньше 4.

Это ожидаемый результат, которого я ожидаю ->

123.123 => 123.123 -> оставить число как есть, потому что точность меньше 4.

123.123456 => 123.1235 -> шкала установлена ​​и округлена в большую сторону.

123 => 123 -> оставить число как есть, так как точность меньше 4.

0.1234445 => 0.1234 -> масштаб установлен и округлен в меньшую сторону.

Как мне достичь этого результата, используя Java BigDecimal?

Ответы [ 2 ]

4 голосов
/ 06 мая 2019

Похоже, что вопрос, который вы действительно задаете: «Как мне обрезать десятичную часть BigDecimal, чтобы в ней было не более 4 чисел справа от десятичной точки?»

Во-первых, ядумаю, вы должны убедиться, что понимаете, что означают scale и precision в отношении BigDecimal.

Если вы запустите эту маленькую программу:

public static void main(String[] args) {
    List<BigDecimal> decimals = new LinkedList<>();
    decimals.add( new BigDecimal(".123456"));
    decimals.add( new BigDecimal("1.23456"));
    decimals.add( new BigDecimal("12.3456"));
    decimals.add( new BigDecimal("123.456"));
    decimals.add( new BigDecimal("1234.56"));
    decimals.add( new BigDecimal("12345.6"));
    decimals.add( new BigDecimal("123456"));

    for(BigDecimal bd : decimals){
        System.out.println(bd.toPlainString() + ". scale = " + bd.scale() + ", precision = " + bd.precision());
    }
}

Вы увидитеследующий вывод:

0.123456. scale = 6, precision = 6 
1.23456. scale = 5, precision = 6
12.3456. scale = 4, precision = 6
123.456. scale = 3, precision = 6
1234.56. scale = 2, precision = 6
12345.6. scale = 1, precision = 6
123456. scale = 0, precision = 6

Теперь вы должны увидеть, что вы хотите сделать запрос, а затем настроить scale числа.

static BigDecimal doIt(BigDecimal input){
    if(input.scale() > 4){
        return input.setScale(4, RoundingMode.HALF_DOWN);
    }
    else{
        return input;
    }
}

Маленькая тестовая программа показываетВывод - это то, что вы просили:

public static void main(String[] args) {
    List<BigDecimal> decimals = new LinkedList<>();
    decimals.add(new BigDecimal("123.123"));
    decimals.add(new BigDecimal("123.123456"));
    decimals.add(new BigDecimal("123"));
    decimals.add(new BigDecimal("0.1234445"));


    for (BigDecimal bd : decimals) {
        System.out.println(bd.toPlainString() + " ---> " + doIt(bd));
    }
}

Вывод

123.123 ---> 123.123
123.123456 ---> 123.1235
123 ---> 123
0.1234445 ---> 0.1234
0 голосов
/ 06 мая 2019

Эти свойства имеют методы доступа, вы можете просто проверить их напрямую:

public static void setScaleIfNeeded(BigDecimal bd, int scale, int minPrecision) {
    if (bd.precision() >= minPrecision) {
        bd.setScale(scale);
    }
}
...