12,javase程式碼實戰-迴圈控制——用while計算1+1/ 2!+1/ 3!+....+1/ 10!(三)

程式設計侯發表於2018-02-25

問題介紹:
計算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異常,說明無法結束的除法表示式;沒有精確的除結果,要為其指定精確的小數位數,舍入模式。

相關文章