您的位置:首页 > 编程语言 > Java开发

12,javase代码实战-循环控制——用while计算1+1/ 2!+1/ 3!+....+1/ 10!(三)

2018-02-25 16:59 363 查看
问题介绍:

计算1+1/2!+1/3!+….+1/10!。

问题分析:

因为存在小数,所以使用基本数据类型进行运算,肯定会丢失精度,所以要使用java中的BigDecimal实现。

代码实现:

/**
* 1,创建sum 保存累加和
* 2,外层for循环用于控制累加的次数
*    内层for循环实现分母的阶层。
*    使用BigDecimal来实现计算
*
*/
int n=10;
int k =1;
BigDecimal sum =new BigDecimal("0");//总和
BigDecimal fz =new BigDecimal("1.0");//分子1
for(int i =1;i<=n;i++){
k=1;
for(int j =1;j<=i;j++){//计算 阶乘的分母
k*=j;
}
//实现累加 保留小数5位 舍入模式(四舍五入)
sum =sum.add(fz.divide(new BigDecimal(k),5, BigDecimal.ROUND_HALF_EVEN));
}
System.out.println("和为:"+sum);


效果图:


总结:

1,实现累加时,只用sum.add()是不能实现累加的,因为执行加减乘除都是返回一个新的对象的,不在保存到原来的sum对象中。因为BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以a.add(b);虽然做了加法操作,但是a并没有保存加操作后的值,正确的用法应该是a=a.add(b);

2,在new BigDecimal()时,传入的参数应是整型或者字符串的,若是浮点型的话,也会造成二进制表达不精确的问题。

3,Non-terminating decimal expansion; no exact representable decimal result异常,说明无法结束的除法表达式;没有精确的除结果,要为其指定精确的小数位数,舍入模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  12 java