有这样一道智力题:三人住旅馆,老板娘说30元她们付钱后进去了,老板娘想起今天是特价25元,就叫伙计拿5元还给三位顾客,可伙计藏了2元,给了她们3元,这样她们每人得1元,就是说每人付了9元,那3*9=27,再加伙计藏的2元,等于29元,那还有1元哪里去啦?

很多人疑惑蛮久,这剩下的1块钱到底去了哪里?我们用角色分析一下:

老板:实得到25元

伙计:实得 2元

客户:付出3*9=27成本

27=25+2 成本和收益是平衡的。上面主要是混淆了逻辑。

但在java开发中,你的钱也许一不小心就会丢失哦,请看题!

public class TestFloatDouble { public static void main(String[] args) {      System.out.println(0.05f+0.01f);     System.out.println(1.0f-0.42f);       System.out.println(4.015d*100);       System.out.println(123.3d/100);   }}

猜对话,有大奖!哈哈

0.0600000020.58000004401.499999999999941.2329999999999999

我们发现在使用浮点数类型float或者double进行运算时,数据有可能会失真。是上面原因呢?

我们知道,计算机并不能识别除了二进制数据以外的任何数据。无论我们使用何种编程语言,在何种编译环境下工作,都要先 把源程序翻译成二进制的机器码后才能被计算机识别。以上面提到的情况为例,我们来验证一下

public class TestFloatDouble {  public static void main(String[] args) {      System.out.println(Float.toHexString(0.05f));     System.out.println(Float.toHexString(0.01f));     System.out.println(Float.toHexString(1.0f));      System.out.println(Float.toHexString(0.42f));

       System.out.println(Double.toHexString(4.015d));       System.out.println(Double.toHexString(123.3d));

     System.out.println(0.05f+0.01f);     System.out.println(1.0f-0.42f);       System.out.println(4.015d*100);       System.out.println(123.3d/100);   }}

其结果为:

0x1.47ae14p-70x1.0p00x1.ae147ap-20x1.00f5c28f5c28fp20x1.ed33333333333p60.0600000020.58000004401.499999999999941.2329999999999999

其中:ox表示十六进制

p表示指数,其基数是2

应该是不难理解的。

总之, 在需要精确答案的地方,要避免使用float 和double;对于货币计算,要使用int、long 或BigDecimal。

参考资料:

【1】https://blog.csdn.net/aya19880214/article/details/45891581

转载于:https://www.cnblogs.com/davidwang456/p/11442177.html

一块钱哪里去了?--java浮点型背后的故事相关推荐

  1. 一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序。...

    一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序. public class A {public static void ma ...

  2. 一道经典的面试题:一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(编写java程序)...

    一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序. public class BuyChicken { public stat ...

  3. 一天一块钱第二天翻倍_再把钱翻倍

    一天一块钱第二天翻倍 总览 很久以前,我写了一篇关于用双倍赚钱的文章. 但是,当解决方案相当简单时,仍然是许多开发人员普遍担心的问题. 用双倍赚钱的问题 double有两种类型的错误. 它存在表示错误 ...

  4. 一块钱可以买一瓶水 两个空瓶可以换一瓶水 三个瓶盖换一瓶水 请问二十块钱可以买多少瓶水?

    package Test;import java.util.Scanner;/*** 一块钱可以买一瓶水 两个空瓶可以换一瓶水 三个瓶盖换一瓶水* 请问二十块钱可以买多少瓶水?* @author ui ...

  5. 关于60枚一分两分五分硬币凑成一块钱的解决方法

    关于60枚一分两分五分硬币凑成一块钱的解决方法 一.强行三重for循环 #include<stdio.h> int main() {int a, b, c;for (a = 1; a &l ...

  6. 一块钱买一瓶水,两个空瓶换一瓶水,三个瓶盖换一瓶水,现在有20块钱,一共可以喝多少瓶水?

    /* ************************************************************************ > File Name: water.cp ...

  7. 不该失去的,一块钱也不放弃

    很多人都觉得,有钱人既然财力雄厚,花钱时必定毫不手软.然而,观察成功的CEO,你会发现,他们多数人花钱也花得小心,对于什么该花.值得花,算得十分精细. 华人首富.香港长江实业与和记黄埔董事局主席李嘉诚 ...

  8. 7个连环问揭开java多线程背后的弯弯绕

    摘要:很多java入门新人一想到java多线程, 就会觉得很晕很绕,什么可见不可见的,也不了解为什么sync怎么就锁住了代码. 本文分享自华为云社区<java多线程背后的弯弯绕绕到底是什么? 7 ...

  9. 心得 | 《用得上的商学课》 004 边际成本 | 飞机起飞前的座位,只卖一块钱?...

    图片来源于<用得上的商学课>课程封面 004 边际成本(Marginal Cost,简称MC) 在前3节课程分别学习了机会成本.比较优势.沉没成本,本节课学习边际成本. 定义:       ...

最新文章

  1. Set和存储顺序深入探讨、SortedSet排序的示例
  2. 实战:基于tensorflow 的中文语音识别模型 | CSDN博文精选
  3. Linux 入门记录:六、Linux 硬件相关概念(硬盘、磁盘、磁道、柱面、磁头、扇区、分区、MBR、GPT)...
  4. Get Started with Apex的playground练习
  5. 【PAT乙级】1052 卖个萌 (20 分)
  6. 手把手带你掌握计算机视觉原始论文细节阅读
  7. 关于寻路算法的一些思考(3):A*算法的实现
  8. UE4 多人联机显示每个人的playid
  9. java学习-BeanUtils给对象的属性赋值
  10. 原创:CAD批量去除教育版戳记
  11. 【unity3d】复刻死亡之书自动设置摄像机景深
  12. empty怎么发音_empty是什么意思_empty的翻译_音标_读音_用法_例句_爱词霸在线词典...
  13. Sparx Systems发布Enterprise Architect 16
  14. UFS Write Booster Feature Overview
  15. 设计模式(博客园精化集)〈转〉
  16. 利用Python网络爬虫实现对网易云音乐歌词爬取
  17. 互联网大陆的守夜人:信息加密技术
  18. 码教授M01和J42项目答辩胜利结束,广阔天空任你们闯荡!
  19. SDM845的音频路径分析
  20. 理光一体机扫描的时候显示服务器响应错误,理光(ricoh)2550一体机扫描文件到server 2012r2的共享文件夹传输失败。...

热门文章

  1. float取整数部分_一步一步学Python3(小学生也适用) 第六篇: 变量及整数(int)类型...
  2. java 多线程 异步日志_精彩技巧(1)-- 异步打印日志的一点事
  3. java 模型 数据库_数据库表与java域模型之间的mapping和自动生成(基于mybatis)
  4. java 线程包_Java 多线程——工具包
  5. python做图像识别好还是c++好_OpenCV人脸检测(C++/Python)
  6. php 接受数组_PHP接收前端发送的数组
  7. android 分段显示百分比,按百分比设置排名-Android DisplayMetrics
  8. bayes python 源代码
  9. 机器学习笔记 soft-DTW(论文笔记 A differentiable loss function for time-series)
  10. 文巾解题 53. 最大子序和