为了提供公司的财务信息化,公司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

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

    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的秘密的更多相关文章

  1. 简单BigDecimal运算精度

    项目中遇到了数值运算,如网上所写的,一般有这几个方法: /** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ publ ...

  2. [置顶] 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!

    在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...

  3. 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!

    在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...

  4. Char、float、Double、BigDecimal

    Char初识 char: char类型是一个单一的 16 位 Unicode 字符 char 在java中是2个字节("字节"是byte,"位"是bit ,1 ...

  5. TypeScript: Angular 2 的秘密武器(译)

    本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...

  6. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密

    0x00 前言 在匹夫的上一篇文章<匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置>的最后,匹夫以总结和后记的方式涉及到一部分迭代器的知识.但是觉得还是不够过瘾,很多需要说清楚 ...

  7. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  8. 网站的SEO以及它和站长工具的之间秘密

    博客迁移没有注意 URL 地址的变化,导致百度和 google 这两只爬虫引擎短时间内找不到路.近段时间研究了下国内最大搜索引擎百度和国际最大搜索引擎google的站长工具,说下感受. 百度的站长工具 ...

  9. Atitit 图像处理的心得与疑惑 attilax总结

    Atitit 图像处理的心得与疑惑 attilax总结 1.1. 使用类库好不好??还是自己实现算法1 1.2. 但是,如果遇到类库体积太大,后者没有合适的算法,那就只能自己开发算法了1 1.3. 如 ...

随机推荐

  1. .Net 连接FTP下载文件报错:System.InvalidOperationException: The requested FTP command is not supported when using HTTP proxy

    系统环境: Windows + .Net Framework 4.0   问题描述: C#连接FTP下载文件时,在部分电脑上有异常报错,在一部分电脑上是正常的:异常报错的信息:System.Inval ...

  2. JS 一些有意思的写法

    对于 C语言中的 &&(有一个为假,返回的为false) 和 || (有一个为真,即为真),但是对于 JS中的 && 和 || 运算是有所不同的. 详情见下面: &am ...

  3. pak文件的打包和解包

    pak格式的文件 一般游戏有资源 游戏素材会打包放进去 比如游戏语音 游戏多加点语音  多加一些贴图资源 外部文件实现的 素材--->pak文件--->用的时候从文件中取出来 文件的打包 ...

  4. 线上调试工具 jvm-sandbox使用

    jvm-sandbox使用 1 快速安装 1.1 下载解压 # 下载最新版本的JVM-SANDBOX wget http://ompc.oss-cn-hangzhou.aliyuncs.com/jvm ...

  5. 【阿里云IoT+YF3300】3. Alink物模型之属性上传和下发

    [名词解释]属性:设备的功能模型之一,一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等.属性支持 GET 和 SET 请求方式.应用系统可发起对属性的读取和设置请求. 在上一篇文章& ...

  6. 《Java 8 in Action》Chapter 7:并行数据处理与性能

    在Java 7之前,并行处理数据集合非常麻烦.第一,你得明确地把包含数据的数据结构分成若干子部分.第二,你要给每个子部分分配一个独立的线程.第三,你需要在恰当的时候对它们进行同步来避免不希望出现的竞争 ...

  7. Suring开发集成部署时问题记录

    前言 开发时一定要用管理员模式打开VS或者VSCODE进行开发,同时不要在nuget上直接下载,要去github上下载源代码调试.第一方便调试,第二Surging迭代较快,nuget版本往往不是最新的 ...

  8. Leetcode之深度优先搜索(DFS)专题-690. 员工的重要性(Employee Importance)

    Leetcode之深度优先搜索(DFS)专题-690. 员工的重要性(Employee Importance) 深度优先搜索的解题详细介绍,点击 给定一个保存员工信息的数据结构,它包含了员工唯一的id ...

  9. 使用Springboot Cache做简单缓存

    使用Springboot Cache做简单缓存 1.简单介绍 ​ 当我们需要展示数据的时候,后台会根据需要从服务器中获取数据,但是频繁的请求数据库会对服务造成压力,于是我们引入了缓存这个概念. ​ 当 ...

  10. JVM体系结构详解

    每个Java开发人员都知道字节码将由JRE (Java运行时环境)执行.但是很多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码.解释代码并执行代码.作为开发者, ...