2017-02-28 86 views
1

我正在尝试使用Java进行产品计算,但似乎无法使其工作。我最初尝试使用WolframAlpha,但是我超出了处理时间。在Java中使用BigDecimal进行产品计算

其计算公式为:Product (n/1220096908800), n=1..1220096908800

这是代码我试过:

BigDecimal z = new BigDecimal("0"); 
BigDecimal n = new BigDecimal("1220096908800"); 

for (BigDecimal x = BigDecimal.valueOf(1); x.compareTo(n) < 0; x = x.add(BigDecimal.ONE)) { 
    z = (x.divide(n)).multiply(z); 
} 

z = z.setScale(8, BigDecimal.ROUND_DOWN); 
DecimalFormat df = new DecimalFormat(); 
df.setMaximumFractionDigits(3); 

df.setMinimumFractionDigits(6); 

df.setGroupingUsed(false); 
System.out.print(df.format(z)); 

的思考?

编辑:这是我收到

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 
    at java.math.BigDecimal.divide(BigDecimal.java:1690) 
    at javaapplication3.JavaApplication3.main(JavaApplication3.java:34) 
+1

什么“似乎无法得到它的工作“是什么意思? – nicomp

+7

所以你正在做这个循环,你分2个数字,然后乘以0,这将是每次都是0。你能解释你想达到的目标吗? – ControlAltDel

+0

当你说产品(n/12000 ..)那是什么意思,什么产品? –

回答

1

错误您从开始BigDecimal z = new BigDecimal("0"); 所以,如果你通过0乘以一切,它总会回来0

另一个问题是你试图在某个点上划分两个不能划分的BigDecimal

http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

如果准确的商值不能表示(因为它具有 非终止十进制扩展),则抛出ArithmeticException。

如果我理解正确,你正在试图计算是:

1220096908800!/1220096908800^1220096908800 

也许你应该看看Stirling's approximation

或如何演讲:How Does n! Compare to n^n

+0

这与产品(Π)计算不同,它与求和类似,所连接的计算不是等价或可比较的,因此斯特林逼近不会不适用,你将z设置为0是正确的,但应该从1 – MosaicOrange

+0

开始;' N = N/N * N/N =(1 * 2 * ... N)/(N * N * N) * N) 和(1 * 2 * ... * N)= N! 和'N * N * ... N' N次='N power N' ='N^N' so产品(n/1220096908800)= 1220096908800! /(1220096908800^1220096908800) –