会计的疑惑--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的秘密_第1张图片

 

是不是没创建总额对象的问题?赶紧改改:

    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也拉近了和扫地僧的距离,从扫地僧身上学到了很多没有掌握的东西。

你可能感兴趣的:(会计的疑惑--BigDecimal的秘密)