负数的BigDecimal.pow()

时间:2012-02-15 10:57:41

标签: java bigdecimal exponentiation

我找不到正确的答案,所以这是我的问题:我希望能够计算price和{{的指数化(正或负百分比) 1}}。

期望:


案例#1
价格: 1.000,00
指数百分比: 5%

以正百分比计算5年以上:

period

案例#2
价格: 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

结果:


这个负百分比出错了,因为我的java代码打印出来了:

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

我认为我的代码非常简单:

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());
}

1 个答案:

答案 0 :(得分:2)

您应该乘以1 + percents/100,1%是1/100。

请注意,一年内5%的注意力使1000变为1050而不是5000

所以5%:1.05^n和负[-5%]:0.95^n

您可以使用BigDecimal来执行此操作,因为数字不是整数。

编辑:[作为对编辑问题的回复] 您的编辑代码不会产生您给出的输出[假设ONE_HUNDRED已正确初始化],但它仍有一个新问题:< / p>

  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)的结果保存在新的临时变量中 - 然后将其打印出来。