會計的疑惑--BigDecimal的秘密


  為了提供公司的財務信息化,公司A上線了一套自主研發的財務系統,上班第一天,財務C姐就發現了情況不對:幾項支出都對,但支出總和一直為0,趕緊向大老板報告。大老板勃然大怒,責令技術部門今天必須解決,小B負責了這個模塊出現了問題,被技術總監大罵一通,澤明中午吃飯前必須解決,否則不用吃飯了,可以直接滾蛋了!

小B慌了,失業的話,下個月的房租就沒有着落了,感覺拉出這段代碼進行調試:

    public static void main(String[] args) {
        BigDecimal cost1=new BigDecimal("1024");
        BigDecimal cost2=new BigDecimal("2048");
        BigDecimal cost3=new BigDecimal("3072");
        BigDecimal cost4=new BigDecimal("4096");
        BigDecimal total=BigDecimal.ZERO;
        total.add(cost1);
        total.add(cost2);
        total.add(cost3);
        total.add(cost4);
        System.out.println(total);        
    }

打印結果為:0

會計的疑惑--BigDecimal的秘密

 

是不是沒創建總額對象的問題?趕緊改改:

    public static void main(String[] args) {
        BigDecimal cost1=new BigDecimal("1024");
        BigDecimal cost2=new BigDecimal("2048");
        BigDecimal cost3=new BigDecimal("3072");
        BigDecimal cost4=new BigDecimal("4096");
        BigDecimal total=new BigDecimal("0");
        total.add(cost1);
        total.add(cost2);
        total.add(cost3);
        total.add(cost4);
        System.out.println(total);        
    }

結果仍然為:0

考慮到下個月要不要流落街頭的問題,小B趕緊向公司的技術大神掃地僧請教,在一個月零食伺候的誘惑下,掃地僧放下手頭的<代碼大全2>,掃了一眼代碼,動了動手指。

掃地僧:"好了,你運行一下吧!"。於是又拿起了<代碼大全2>看了起來。

小B 趕緊運行了一下,計算結果正確了,他瞅了瞅代碼,代碼沒怎么變樣呀?

    public static void main(String[] args) {
        BigDecimal cost1=new BigDecimal("1024");
        BigDecimal cost2=new BigDecimal("2048");
        BigDecimal cost3=new BigDecimal("3072");
        BigDecimal cost4=new BigDecimal("4096");
        BigDecimal total=BigDecimal.ZERO;
        total=total.add(cost1);
        total=total.add(cost2);
        total=total.add(cost3);
        total=total.add(cost4);
        System.out.println(total);        
    }

小B暗想:“一個月的零食呀,太了黑。可是我的程序和掃地僧一樣呀,為什么他的程序能得出正確的結果?而我的就是0呢?不行,我得問出緣由,不能白白浪費了一次請教的機會!”

於是小B虛心向掃地僧請教,掃地僧看在一個月零食的面子上,停下來給菜鳥小B講解。

掃地僧:“記不記的我給你講過,String是不可變的?”

小B:“記得,記得,您老講過,字符String的類是final修飾的,不可改變,字符的拼接是產生新的字符而不是改變原來的值。”

掃地僧:“孺子可教也,其實如BigDecimal,BigInteger,Integer,Long,Short,Byte,Character,Boolean,Float和Double的實例也是不可變的。我們不能修改現有實例的值,對這些類型的操作將返回新的實例”。

小B:“那為什么它這樣設計呢?不是很容易讓大家犯錯了嗎?”

掃地僧:“起先,不可變類型看起來可能很不自然,但

是它們具有很多勝過與其向對應的可變類型的優勢。不可變類型更容易設計、實

現和使用;它們出錯的可能性更小,並且更加安全。”

小B:“您老真厲害!”

掃地僧:“你還年輕,悟性也好,慢慢加油吧!”

這次事件起的突然,解決的也比較順利,財務系統也運行良好了。小B的職位也保住了,為了答謝掃地僧,小B也包圓了掃地僧一個月的零食,借此機會,小B也拉近了和掃地僧的距離,從掃地僧身上學到了很多沒有掌握的東西。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM