zoukankan      html  css  js  c++  java
  • 会计的疑惑--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也拉近了和扫地僧的距离,从扫地僧身上学到了很多没有掌握的东西。

  • 相关阅读:
    贪心法之活动安排问题
    动态规划算法之最优二叉搜索树
    动态规划之最大字段和问题
    动态规划算法之图像压缩问题
    动态规划算法之0-1背包问题
    动态规划算法之投资问题
    平面点集的凸包问题
    动态规划(DP)之多边形游戏问题
    凸多边形最优三角划分
    最长公共子序列问题
  • 原文地址:https://www.cnblogs.com/davidwang456/p/11573062.html
Copyright © 2011-2022 走看看