import java.math.*;
import java.util.*;public class Main {
public static void main(String[] args) {
BigDecimal mol = new BigDecimal(1);
    BigDecimal deno = new BigDecimal(356);
for(int i=356; i>365-39; ++i) {
mol.multiply(new BigDecimal(i));
}
deno.pow(40);
double ans = 1- mol.divide(deno).doubleValue();
System.out.println(ans);
}
}
/*
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decima
l expansion; no exact representable decimal result.
        at java.math.BigDecimal.divide(BigDecimal.java:1514)
        at Main.main(Main.java:12)
shell returned 1
*/我想求1-(365*364* *(365-39))/ 365^40 的结果 ,不用大数类显然会溢出,但 用大数类 java运行了好久 抛出异常(见注释)请教我的程序哪里有问题,正确的应该如何,本人java初学  ,谢谢

解决方案 »

  1.   

    首先,不是++i是--i
    其次,i=356是i=365
    再次,不是i>365-39是i>=365-39
    第四,BigDecimal调用函数后,本身值不变,所以要另外赋值:
    mol = mol.multiply(new BigDecimal(i));deno = deno.pow(40);
    最后,divide除法,如果结果是无限小数的话,要指定scale整理后的代码:
    import java.math.BigDecimal;
    import java.math.RoundingMode;public class Test1 {
    public static void main(String[] args) {
    BigDecimal mol = new BigDecimal(1);
    BigDecimal deno = new BigDecimal(356);
    for (int i = 365; i >= 365 - 39; --i) {
    mol = mol.multiply(new BigDecimal(i));
    }
    System.out.println("mol:" + mol);
    deno = deno.pow(40);
    System.out.println("deno:" + deno); BigDecimal result = mol.divide(deno, 10, RoundingMode.HALF_UP);
    // System.out.println(result); double ans = 1 - result.doubleValue();
    System.out.println(ans);
    }
    }
    输出:
    0.7047318781