BigDecimal.pow () отрицательного числа - PullRequest
1 голос
/ 15 февраля 2012

Я просто не могу найти правильный ответ, поэтому вот моя проблема: я хочу иметь возможность рассчитать индексацию ( положительный или отрицательный процент ) для price и period.

Ожидания:


Дело № 1
Цена: 1.000,00
Процент индексации: 5%

Расчет за 5 лет с положительным процентом:

1. 1000 x 5^0 = 1000
2. 1000 x 5^1 = 1050
3. 1000 x 5^2 = 1102,50
4. 1000 x 5^3 = 1157.625
5. 1000 x 5^4 = 1215,50625

Дело № 2
Цена: 1.000,00
Процент индексации: -5%

Расчет за 5 лет с отрицательным процентом:

1. 1000 x -5^0 = 1000
2. 1000 x -5^1 = 950
3. 1000 x -5^2 = 902,50
4. 1000 x -5^3 = 857,375
5. 1000 x -5^4 = 814,50625

Результаты:


И этот отрицательный процент идет не так, потому что мой код Java печатает это:

1000
-5000
-125000
15625000
1175690408

Мой код довольно прост, я думаю:

BigDecimal percentageValue = new BigDecimal("-5");
BigDecimal indexation = percentageValue.divide(ONE_HUNDRED).add(BigDecimal.ONE);
BigDecimal price = new BigDecimal("1000");

for (int i = 0; i < 5; i++)
{
  price = price.multiply(indexation.pow(i));
  System.out.println(price.intValue());
}

Решение:

static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
public static void main(String[] args)
{
 BigDecimal percentageValue = new BigDecimal("-5");
 BigDecimal indexation = percentageValue.divide(ONE_HUNDRED).add(BigDecimal.ONE);
 BigDecimal price = new BigDecimal("1000");

 for (int i = 0; i < 5; i++)
 {
   BigDecimal result = price.multiply(indexation.pow(i));
   System.out.println(result);
 }
}

1 Ответ

2 голосов
/ 15 февраля 2012

Вы должны умножить на 1 + percents/100, 1% равен 1/100.

Обратите внимание, что при 5% интереса за один год 1000 становятся 1050, а не 5000

так для 5%: 1.05^n и для отрицательного [-5%]: 0.95^n

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

РЕДАКТИРОВАТЬ: [как ответ на отредактированный вопрос] Ваш отредактированный код не производит вывод, который вы дали [при условии, что ONE_HUNDRED правильно инициализирован], однако у него все еще есть новая проблема:

  price = price.multiply(indexation.pow(i));
  System.out.println(price.intValue());

посмотрите на вторую итерацию, вы уже установили price = price * indexation^1
При повторном умножении на indexation^i [i == 2] вы получите неверный результат!

Решение может быть одним из таких:

  1. здесь не нужно pow(), просто умножьте каждую итерацию на индексацию.
  2. Не переопределяйте price, сохраните результат price.multiply(indexation.pow(i) в новой переменной temp - и напечатайте его.
...