题目: 假设你口袋里有1$,看到货架上有一排美味的糖果,标价分别为0.10$,0.20$,0.30$...1$,你打算从标价为0.10$的糖果开始买起,每种买一颗,一直到不能支付货架上下一种价格的糖果为止,那么可以买多少颗糖果?还可以找回多少零钱?

使用double的程序如下:

double funds = 1.00;
int itemsBought = 0;
for(double price=.10;funds>=price;price+=.10){
funds -= price;
itemsBought++;
}
System.out.println(itemsBought+" items bought.");
System.out.println("change:$"+funds);

返回结果如下:
3 items bought.
change:$0.3999999999999999

这个答案是不正确的,解决方案是使用BigDecimal,int或者long进行货币计算

使用BigDecimal的程序如下:

final BigDecimal TEN_CENTS = new BigDecimal(".10");
int itemsBought = 0;
BigDecimal funds = new BigDecimal("1.00");
for(BigDecimal price=TEN_CENTS;funds.compareTo(price)>=0;price=price.add(TEN_CENTS)){
itemsBought++;
funds = funds.subtract(price);
} System.out.println(itemsBought+" items bought.");
System.out.println("change:$"+funds);

返回结果如下:
4 items bought.
change:$0

这个结果是正确的。

使用int的程序如下(需将1.00$先转换为100cents):

int itemsBought = 0;
int funds = 100;
for(int price=10;funds>=price;price+=10){
funds -= price;
itemsBought++;
}
System.out.println(itemsBought+" items bought.");
System.out.println("change:$"+funds);

返回结果如下:
4 items bought.
change:$0

这个结果也是正确的。

所以:
1)如果需要通过法定要求的舍入行为进行业务计算,使用BigDecimal是非常方便的;
2)如果性能非常关键,而且又不介意记录十进制小数点,而且所涉及的数值又不太大,就可以使用int或long,
3) 如果数值范围没超过9位十进制数字,就可以使用int,如果数值范围没超过18位十进制数字,可以使用long,如果数值范围超过了18位十进制数字,就必须使用BigDecimal。

Effective Java 之-----精确的答案与double&float的更多相关文章

  1. java中浮点数的比较(double, float)(转)

    问题的提出:如果我们编译运行下面这个程序会看到什么? public static void main(String args[]){ System.out.println(0.05+0.01); Sy ...

  2. Java 浮点数精确性探讨(IEEE754 / double / float)与 BigDecimal 解决方案

    一.抛砖引玉 一个简单的示例: double a = 0.0; IntStream.range(0,3).foreach(i->a+=0.1); System.out.println(a); / ...

  3. 如果需要精确的答案,请避免使用float和double

    Java中的简单浮点数类型float和double不能够进行运算.不光是Java,在其它很多编程语言中也有这样的问题.在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上 ...

  4. 《Effective java》-----读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...

  5. 《Effective Java》学习笔记——积累和激励

    从一个实际案例说起 国庆长假前一个礼拜,老大给我分配了这么一个bug,就是打印出来的报表数量为整数的,有的带小数位,有的不带,毫无规律. 根据短短的两个多月的工作经验以及猜测,最终把范围缩小到以下这段 ...

  6. Effective java读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.J ...

  7. [Effective Java]第八章 通用程序设计

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. Effective Java通俗理解(下)

    Effective Java通俗理解(上) 第31条:用实例域代替序数 枚举类型有一个ordinal方法,它范围该常量的序数从0开始,不建议使用这个方法,因为这不能很好地对枚举进行维护,正确应该是利用 ...

  9. 《Effective Java(中文第二版)》【PDF】下载

    <Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)& ...

随机推荐

  1. C#初学者们,请离代码生成器远点!!!

    在程序开发的世界里,各路前辈们为了提高所谓的编码速度,搞出了各式各样的代码生成器,来避免所谓的重复的人为机械地粘贴和复制代码,以此来提高生产力. 早几年前,我可能会认为这样的做法真得有用,特别是在编码 ...

  2. Visual Studio 2017 安装后无法创建c++或MFC项目

    话话不多说,直接上图

  3. [数据分析工具] Pandas 功能介绍(一)

    如果你在使用 Pandas(Python Data Analysis Library) 的话,下面介绍的对你一定会有帮助的. 首先我们先介绍一些简单的概念 DataFrame:行列数据,类似 Exce ...

  4. Element类型知识大全

    Element类型 除了Document类型之外,Element类型就要算是Web编程中最常用的类型了.Element类型用于表现XML或HTML元素,提供了对元素标签名.子节点及特性的访问.   要 ...

  5. c++---天梯赛---查验身份证

    ★题目: ★题目分析:本题要求输入一个数字n,随后n行输入n个身份证号码.之后进行进一步的判断把错误的身份证号码输出.如果全部正确输出All passed. ★思路方法: ①按题目要求输入. ②对前1 ...

  6. 性能测试资源监控工具nmon使用方法

    1.简述  nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的,它能在系统运行过程中实时地捕捉系统资源的使用 ...

  7. Sublime Text 使用介绍、全套快捷键及插件推荐

    开篇:如果说Notepad++是一款不错Code神器,那么Sublime Text应当称得上是神器滴哥.Sublime Text最大的优点就是跨平台,Mac和Windows均可完美使用:其次是强大的插 ...

  8. 月薪20k以上的高级程序员需要学习哪些技术呢?

    课程内容: 源码分析.分布式架构.微服务架构.性能优化.团队协作效率.双十一项目实战 适用对象: 1-5年或更长软件开发经验,没有工作经验但基础非常扎实,对java工作机制,常用设计思想,常用java ...

  9. 【编程技巧】EXTJS中Ext.grid.GridPanel配置项autoExpandColumn的使用方法

    autoExpandColumn的作用是自动伸展,占满剩余区域.一般使用在列比较少,并且大多数列都比较窄,有一列比较宽的情况下,当然什么时候使用,还是得按照实际情况确定. 使用的时候主要有三点要注意的 ...

  10. 爬虫_vs_反爬虫

    爬虫中有哪些专业术语? 爬虫:自动获取网站数据的程序,关键是批量的获取 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬虫技术将普通用户识别为爬虫,效果再好也不能用(禁止ip) 成本:反爬虫需要人力 ...