BigDecimal вопрос округления - PullRequest
3 голосов
/ 21 мая 2010

Я бы хотел округлить любое число до четверти целого числа.

Например:

100.33 -> 100.50
100.12 -> 100.25
100.66 -> 100.75
100.99 -> 101.00
100.70 -> 100.75
100.00 -> 100.00
100.25 -> 100.25

и т.д ...

спасибо, ребята ...

Ответы [ 3 ]

6 голосов
/ 21 мая 2010

Это делает то, что вам нужно: умножается на 4, округляется, а затем делится на 4.

    String[] tests = {
        "100.33", "100.12", "100.66", "100.99", "100.70", "100.00", "100.25",
    };
    final BigDecimal FOUR = BigDecimal.valueOf(4);
    for (String test : tests) {
        BigDecimal d = new BigDecimal(test);
        d = d.multiply(FOUR).setScale(0, RoundingMode.UP)
             .divide(FOUR, 2, RoundingMode.UNNECESSARY);
        System.out.println(d);
    }
1 голос
/ 21 мая 2010

Я не верю, что это возможно без ручного вмешательства. Вы можете задать параметры округления, передав MathContext конструктору BigDecimal; однако режим округления, используемый в объекте этого класса, должен быть константой перечисления RoundingMode (и ни один из них не реализует требуемый тип округления). Было бы неплохо, если бы вместо этого был интерфейс, в котором вы могли бы написать собственное определение, но у вас это есть.

В зависимости от того, насколько быстрым должен быть ваш код, вы, конечно, можете умножить число на 4, округлить до ближайшего целого числа и снова разделить на 4. Это, вероятно, наименее реальное усилие по программированию, и его относительно легко понять, поэтому, если ваш код не относится к разделу, критичному для производительности, я бы предложил.

0 голосов
/ 21 мая 2010

Math.round(x.doubleValue() * 4) / 4

или Math.ceil или Math.floor в зависимости от того, что вы хотите

...