请考虑下面这段话描述的问题:

有人在一家汽车配件商店购买了一个价值$1.10的火花塞,但是他只有两美元一张的钞票。如果他用一张两美元的钞票支付这个火花塞,那么应该找给他多少零钱呢?

下面是一个试图解决上述问题的程序,它会打印出什么呢?

public class Change{

public static void main(String args[]){

System.out.println(2.00-1.10);

}

}

你可能会很天真的期望该程序能够打印出0.90,但是它如何才能知道你要打印小数点后两位小数呢?

如果你对在Double.toString文档中所设定的将double类型的值转换为字符串的规则有所了解,你就会知道该程序打印出来的小数,足以将double类型的值与最靠近它的临界值区分出来的最短的小数,它在小数点之前和之后都至少有一位,因此看起来,该程序应该打印0.90是合理的。

这么分析可能显得很合理,但是并不正确。如果你运行该程序,你就会发现它打印的是0.8999999999999999。

问题在于1.1这个数字不能被准确的表示成为一个double,因此它被表示成为最接近它的double值。该程序就是从2中减去这个值。遗憾的是,这个计算的结果并不是最接近0.9的double值。表示结果的double值的最短表示就是你所看到的打印出来的那个数字。

更一般的说,问题在于并不是所有的小数都可以用二进制浮点数来精确表示。

如果你使用的是JDK5.0或更新的版本,可以通过printf工具来设置输出精度的方法来修改     该程序:

System.out.printf("%.2f%n",2.00-1.10);

这条语句打印的是正确结果,但是这并不代表它就是对底层问题的通用解决方法:它使用的仍旧是二进制浮点数的double运算。浮点数在一个范围很广的值域上提供了很好的近似,但是它同城不能产生精确的结果。二进制浮点对于货币计算是非常不适合的,因为它不可能将0.1精确的表示为一个长度有限的二进制小数。

解决该问题的一种方式是使用某种整数类型,例如int或long,并且以分为单位来执行计算,修改后程序如下:

System.out.println((200-100) + "cents");

解决该问题的另一种方式是使用执行精确小数运算的BigDecimal。它还可以通过JDBC与SQL DECIMAL类型进行互操作。这里要告诫读者一点,一定要用BigDecimal(String)构造器,而不要使用BigDecimal(double)。后一个构造器江勇它的参数的“精确值”来创建一个实例:new BigDecimal(.1)将返回一个表示0.100000000000000055511151231257827021181583404541015625的BigDecimal。通过使用BigDecimal就可以打印出我们想要的结果0.90:

import java.math.BigDecimal;

public class Change{

public static void main(String[] args){

System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));

]

}

这个版本并不是十分的完美,因为Java并没有为BigDecimal提供任何语言上的支持。使用BigDecimal的计算很可能比那些使用原始类型的计算要慢一些。对于某些大量使用小数的程序来说这是个问题,而对于大多数程序来说,这一点显得也不重要。 总之在需要精确答案的地方,要避免使用float和double,对于货币计算,要使用int、long或BigDecimal。对于语言设计者来说,应该考虑对小数运算提供语言支持。

找零程序Java_JAVA解惑--找零时刻相关推荐

  1. php找零页面,JS实现找零张数最小

    这篇文章主要介绍了JS实现的找零张数最小问题,涉及javascript数学运算相关操作技巧,需要的朋友可以参考下. 完整代码如下: www.jb51.net 找零问题 var price = prom ...

  2. c语言贪心算法找零问题,贪心算法-找零问题-实验报告

    <贪心算法-找零问题-实验报告>由会员分享,可在线阅读,更多相关<贪心算法-找零问题-实验报告(7页珍藏版)>请在人人文库网上搜索. 1.实验三 课程名称:算法设计与实现 实验 ...

  3. 找零程序Java_动态规划——硬币找零问题(java)

    如果要求一个问题的最优解(通常是最大值或者最小值),而且该问题能够分解成若干个子问题,并且小问题之间也存在重叠的子问题,则考虑采用动态规划. 使用动态规划特征:1.求一个问题的最优解2.大问题可以分解 ...

  4. 实现超市收银找零的简单程序

    初学c语言程序与设计的第一个课堂作业 实现简单的"收银","找零"程序 帮助快速理解c语言初期的代码理解问题 建议再自己动手的情况下多练习,熟悉代码编辑的逻辑 ...

  5. C++coin change 硬币找零(附完整源码)

    coin change 硬币找零 coin change 硬币找零算法的完整源码(定义,实现,main函数测试) coin change 硬币找零算法的完整源码(定义,实现,main函数测试) #in ...

  6. 字节跳动2019春招笔试——找零(JavaScript)

    Z国的货币系统包含面值1元.4元.16元.64元共计4种硬币,以及面值1024元的纸币.现在小Y使用1024元的纸币购买了一件价值为N(0<N≤1024)的商品,请问最少他会收到多少硬币? 输入 ...

  7. 【LeetCode】两道贪心算法题目-455分发饼干,860柠檬水找零

    文章目录 第455题:分发饼干 第860题:柠檬水找零 第455题:分发饼干 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个 ...

  8. 字节跳动校招题目——找零问题

    题目描述 Z国的货币系统包含面值1元.4元.16元.64元共计4种硬币,以及面值1024元的纸币.现在小Y使用1024元的纸币购买了一件价值为N(0<N≤1024)的商品,请问最少他会收到多少硬 ...

  9. 柠檬水找零---贪心算法(c++)实现

    来源:力扣 链接:https://leetcode.cn/problems/lemonade-change/ 题目详情: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 ...

最新文章

  1. 成功解决ModuleNotFoundError: No module named 'scipy._lib._ccallback'
  2. 【C语言简单说】三:整数变量扩展和输出扩展(3)
  3. python numpy array中维度的区别 array.shape
  4. 科普文:为什么不能在服务器上 npm install ? #30
  5. 接口向mapper传参数
  6. 杰富瑞主管:若BTC回落,将增加养老基金投资组合中的加密货币成分
  7. php 日期相减 时分秒,PHP计算两个时间戳间隔的日时分秒的代码实例
  8. python自动化办公要学多久-用 Python 自动化办公能做到哪些有趣或有用的事情?...
  9. python字典弱引用_weakref
  10. python3视频教程哪个好_python3入门视频教程
  11. 生鲜电商进入2.0时代,美团还有“后招”吗?
  12. 如何自建微信外卖平台_如何建立微信点餐平台 微信小程序外卖怎么做
  13. Effective Modern C++读书笔记
  14. 地球人的来源1【由罗斯威尔事件得到的可能解释】
  15. vue组件库大全(忘了的时候可以进来找一下~)
  16. Android-茫茫9个月求职路,终于拿满意offer,项目实践
  17. 切片(Slice)在python中的运用(:)
  18. cocos2d-x游戏开发 跑酷(四) 关联物理世界
  19. About Flash
  20. Unity3D-制作火焰效果

热门文章

  1. pinpoint agent性能优化方面官方文档翻译
  2. jQuery Event.delegateTarget 属性详解
  3. css修改输入框的placeholder颜色
  4. bzoj1057,poj3250
  5. PHP 可变函数经典用法
  6. 从Myeclipe转向Idea,各种遇坑与填坑经验,持续更新(图文)
  7. 气门组的结构组成有哪些_挖机破碎钳子,液压粉碎钳都有哪些结构组成,你知道吗...
  8. GOF23种设计模式在Java中的应用(part 3)
  9. 在WinForm程序中读写系统配置
  10. 各种数字显示屏接口:LVDS, DVI, HDMI, DisplayPort, DSI