Java, BigDecimal. Проблемы с разделением

Я пытаюсь рассчитать процентный коэффициент. То есть, учитывая 20%, преобразуйте его в 0.2 (мое намерение состоит в том, чтобы позже умножить значения на это и получить 20% значений).

В любом случае вопрос связан с этим фрагментом кода:

public static void main(String[] args) {
    int roundingMode = BigDecimal.ROUND_FLOOR;
    BigDecimal hundred = new BigDecimal("100");
    BigDecimal percentageFactor = null;
    BigDecimal percentage = new BigDecimal("20");
    BigDecimal value = new BigDecimal("500");
    percentageFactor = percentage.divide(hundred, roundingMode);
    float f = percentage.floatValue() / hundred.floatValue();
    f = value.floatValue() * f;
    BigDecimal aux = value.multiply(percentageFactor);
    System.out.println("factor:"+percentageFactor.toString());
    System.out.println("final falue:"+aux.toString());
    System.out.println("Float Value:"+f);       
}

Я ожидаю, что результатом этого будет что-то вроде:

factor: 0.2
final value: 100
float value: 100

но вместо этого percentage.divide(hundred, roundingMode); возвращает ноль, следовательно, я получаю:

factor:0
final falue:0
Float Value:100.0

Что я делаю неправильно? Как я могу правильно делить два больших десятичных знака?

Кстати, я использую BigDecimal, потому что буду вычислять денежные проценты, поэтому я хочу контролировать округление.

Ответы

Ответ 1

Я думаю, что лучшим решением является установка запрошенной шкалы при делении: В этом случае возможно 2.

    BigDecimal hundred = new BigDecimal(100);
    BigDecimal percentage = new BigDecimal(20);
    BigDecimal value = new BigDecimal(500);
    BigDecimal percentageFactor =
                 percentage.divide(hundred,2, BigDecimal.ROUND_HALF_UP);

    value = value.multiply(percentageFactor);
    System.out.println("final value:"+ value);

окончательное значение 100.00

(Умножение использует шкалу из коэффициентов (0 + 2), но это также можно указать.)

Я бы использовал HALF_UP для учета (в моем законодательстве) или EVEN (для статистики) для режима округления.

Ответ 2

Шкала new BigDecimal("20") равна нулю, потому что у вас нет десятичной точки. Это означает, что ваш percentage.divide(hundred, BigDecimal.ROUND_FLOOR) будет генерировать нуль (эффективно int(20/100) или 0).

Если вы действительно хотите делать дробные вещи, используйте new BigDecimal("20.00"), чтобы шкала была установлена ​​правильно, или используйте один из других конструкторов, чтобы точно установить масштаб.

Здесь вывод от этого простого изменения 20 до 20.00, в комплекте с вашим заклинанием misteak: -)

factor:0.20
final falue:100.00
Float Value:100.0

Ответ 3

float имеет только 6 цифр точности и почти никогда не является хорошим выбором, я бы предложил вам вместо этого использовать double. (или BigDecimal может быть лучше в некоторых случаях)