一块钱哪里去了?--java浮点型背后的故事
有这样一道智力题:三人住旅馆,老板娘说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浮点型背后的故事相关推荐
- 一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序。...
一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序. public class A {public static void ma ...
- 一道经典的面试题:一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(编写java程序)...
一只公鸡5块钱,一只母鸡3块钱,3只小鸡一块钱,一个农夫用100块钱买100只鸡(不许解方程),怎么实现?编写java程序. public class BuyChicken { public stat ...
- 一天一块钱第二天翻倍_再把钱翻倍
一天一块钱第二天翻倍 总览 很久以前,我写了一篇关于用双倍赚钱的文章. 但是,当解决方案相当简单时,仍然是许多开发人员普遍担心的问题. 用双倍赚钱的问题 double有两种类型的错误. 它存在表示错误 ...
- 一块钱可以买一瓶水 两个空瓶可以换一瓶水 三个瓶盖换一瓶水 请问二十块钱可以买多少瓶水?
package Test;import java.util.Scanner;/*** 一块钱可以买一瓶水 两个空瓶可以换一瓶水 三个瓶盖换一瓶水* 请问二十块钱可以买多少瓶水?* @author ui ...
- 关于60枚一分两分五分硬币凑成一块钱的解决方法
关于60枚一分两分五分硬币凑成一块钱的解决方法 一.强行三重for循环 #include<stdio.h> int main() {int a, b, c;for (a = 1; a &l ...
- 一块钱买一瓶水,两个空瓶换一瓶水,三个瓶盖换一瓶水,现在有20块钱,一共可以喝多少瓶水?
/* ************************************************************************ > File Name: water.cp ...
- 不该失去的,一块钱也不放弃
很多人都觉得,有钱人既然财力雄厚,花钱时必定毫不手软.然而,观察成功的CEO,你会发现,他们多数人花钱也花得小心,对于什么该花.值得花,算得十分精细. 华人首富.香港长江实业与和记黄埔董事局主席李嘉诚 ...
- 7个连环问揭开java多线程背后的弯弯绕
摘要:很多java入门新人一想到java多线程, 就会觉得很晕很绕,什么可见不可见的,也不了解为什么sync怎么就锁住了代码. 本文分享自华为云社区<java多线程背后的弯弯绕绕到底是什么? 7 ...
- 心得 | 《用得上的商学课》 004 边际成本 | 飞机起飞前的座位,只卖一块钱?...
图片来源于<用得上的商学课>课程封面 004 边际成本(Marginal Cost,简称MC) 在前3节课程分别学习了机会成本.比较优势.沉没成本,本节课学习边际成本. 定义: ...
最新文章
- Set和存储顺序深入探讨、SortedSet排序的示例
- 实战:基于tensorflow 的中文语音识别模型 | CSDN博文精选
- Linux 入门记录:六、Linux 硬件相关概念(硬盘、磁盘、磁道、柱面、磁头、扇区、分区、MBR、GPT)...
- Get Started with Apex的playground练习
- 【PAT乙级】1052 卖个萌 (20 分)
- 手把手带你掌握计算机视觉原始论文细节阅读
- 关于寻路算法的一些思考(3):A*算法的实现
- UE4 多人联机显示每个人的playid
- java学习-BeanUtils给对象的属性赋值
- 原创:CAD批量去除教育版戳记
- 【unity3d】复刻死亡之书自动设置摄像机景深
- empty怎么发音_empty是什么意思_empty的翻译_音标_读音_用法_例句_爱词霸在线词典...
- Sparx Systems发布Enterprise Architect 16
- UFS Write Booster Feature Overview
- 设计模式(博客园精化集)〈转〉
- 利用Python网络爬虫实现对网易云音乐歌词爬取
- 互联网大陆的守夜人:信息加密技术
- 码教授M01和J42项目答辩胜利结束,广阔天空任你们闯荡!
- SDM845的音频路径分析
- 理光一体机扫描的时候显示服务器响应错误,理光(ricoh)2550一体机扫描文件到server 2012r2的共享文件夹传输失败。...
热门文章
- float取整数部分_一步一步学Python3(小学生也适用) 第六篇: 变量及整数(int)类型...
- java 多线程 异步日志_精彩技巧(1)-- 异步打印日志的一点事
- java 模型 数据库_数据库表与java域模型之间的mapping和自动生成(基于mybatis)
- java 线程包_Java 多线程——工具包
- python做图像识别好还是c++好_OpenCV人脸检测(C++/Python)
- php 接受数组_PHP接收前端发送的数组
- android 分段显示百分比,按百分比设置排名-Android DisplayMetrics
- bayes python 源代码
- 机器学习笔记 soft-DTW(论文笔记 A differentiable loss function for time-series)
- 文巾解题 53. 最大子序和