java 使用BigDecimal 类求一个数学概率, 抛出异常

mingchaoyan 2010-03-03 08:33:13
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初学 ,谢谢
...全文
148 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2010-03-03
  • 打赏
  • 举报
回复
来晚了,都让楼上说了.
chen09 2010-03-03
  • 打赏
  • 举报
回复
首先,不是++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

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧