Java面试官:兄弟,你确定double精度比float低吗?
我有一个朋友,叫老刘,戴着度数比我还高的近视镜,显得格外的“程序员”;穿着也非常“不拘一格”,上半身是衬衣西服,下半身是牛仔裤运动鞋。
我和老刘的感情非常好,每周末我们都要在一起吃顿饭。这周,我们吃的是洛阳有名的吴家刀削面,席间他聊了一件蛮有趣的面试经历;我听得津津有味。
散席的时候,老刘特意叮嘱我把他和面试者的对话整理一下发出来,因为他觉得这段对话非常的精彩,值得推荐给更多初学Java的年轻人。
注:以下是老刘和面试者东丰的真实对话。如有雷同,请勿对号入座。
老刘:“东丰,你长期从事金融软件的开发,记录存款和金额之类的有关数据用哪种数据类型啊?”
东丰:“当然用float啊,精确度比double高嘛。”
老刘:“东丰,你确定double精度比float低吗?”
东丰:“那当然啊,double只精确到小数点后两位,double这个单词的意思不就是二的意思吗?”
老刘:“东丰,你右手边刚好有一本《Java核心技术卷1》,你翻到第35页,看一下。”
东丰:“…哦,刘经理,不用了。不好意思,刚刚开个玩笑,为了缓和一下面试的紧张气氛。看您厚厚的眼镜片下藏着一双深邃的眼睛,我觉得您一定大有学问。在金融计算中,必须要使用BigDecimal,double和float都不适合。因为单单一个精度问题就能把人整晕了。”
“我记得有一次,我碰巧要计算一个表达式a - b
,a的值为2,b的值为1.1,我侄女五岁半都知道答案应该是0.9,结果程序算出来的结果竟然是0.89999…,我当时又气又激动,气的是计算机还没有我侄女靠谱,激动的是我竟然第一次找到了Java的bug。”
“我赶紧把这个bug反馈到了沉默王二的青铜时代群,以为我要被大家点赞表扬了。结果收到了大佬们一致的无情的嘲笑!”
“好在,群主二哥及时地安慰了我。他发我私信说:‘首先,计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。double和float提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值,这就导致了你看到的不正确的结果。’”
“看到二哥的信息后,我沮丧的心情得到了很大的安慰。我于是就对使用浮点数和小数中的问题进行了深入地研究。”
“BigDecimal可以表示任意精度的小数,并对它们进行计算。但要小心使用 BigDecimal(double)
构造函数,因为它会在计算的过程中产生舍入误差。最好要使用基于整数或 String 的构造函数来创建BigDecimal对象。”
老刘:“哇,你回答得很好。那我们来看下一个问题。你应该知道2 / 0
的时候程序会报java.lang.ArithmeticException
的错误,那么你知道2.0 / 0
的结果吗?”
东丰:“刘经理,您这个问题难不倒我。结果是Infinity
(英菲尼迪),不好意思,我的英语口语能力有限啊。其实就是无穷的意思。不仅有正无穷大,还有负无穷大,甚至还有一个叫做NaN
的特殊值。NaN
代表‘不是一个数字’。这些值的存在是为了在出现错误条件时,程序还可以用特定的值来表示所产生的结果。这些错误的情况包括算术溢出、给负数开平方根,还有您说的除以 0 等。”
老刘:“东丰啊,你的发音比我好啊,挺准确的。”
东丰:“刘经理您见笑了。”
老刘:“我这还有一道关于数组的问题,你稍等一下,我在纸上写一下。”
int[] a = {1, 2, 3, 4}
int[] b = {2, 4}
int[] c = {1, 3}
int[] d = {2}
“有这样四个数组,要求每个数组只留一个唯一的元素。也就是说,a、b、c、d四个数组之间的元素不能相同,你打算怎么做呢?”
东丰:“刘经理,我能用一下您的凌美钢笔吗?”
老刘:“可以啊,你请用。”
东丰:“我大致演算了一下。说一下我的思路。d只能是2,b只能是4,a是1或者3,c是3或者1。遍历长数组,剔除长数组中含有的最短数组的元素。b中剔除d中的2还剩下4,a中剔除d中的2还剩下1、3、4,c中不含d中元素,所以不用剔除。剔除后b中还剩下一个4,d中是一个2。再次遍历剔除a中的4。最后a和c中只剩下1和3了,再分别剔除互异的数就行了。”
“我觉得比较笨的作法,刘经理您觉得可行吗?”
老刘:“可行,没有问题。那,你对变量和方法的命名有什么看法呢?请随意发挥啊。”
东丰:“我在博客园上曾看到一个有意思的投票统计——选出平常工作时自己认为最难的事情,选项大致有:”
- 写各种文档
- 与客户沟通
- 预估工作量
- 给变量命名
“投票结果完全出乎我的意料,排在第一的竟然是‘给变量命名’!变量命名实在是软件开发中最常见的一件事了,但这件事要想做好,还真是不容易啊。”
“阿里巴巴Java开发手册中「强制」规定,方法名、参数名、成员变量、局部变量要统一使用lowerCamelCase风格,必须遵从驼峰形式。”
localValue // 变量
getHttpMessage() // 方法
“有很长一段时间,我总是在纠结究竟是用拼音好还是用英语单词好的问题。后来我下定了决心:要么用拼音要么用英语单词,只要看到名字就能知道这个变量或者方法的用意就行了。”
“有时候,确实很难给变量取一个好名字。这时候,我就会选择一种省时省力省心的做法——将变量名命名为类型名。比如说:”
Map map;
List list;
“最好,变量声明的地方要离第一次使用的地方近。否则的话,代码阅读起来会很困难,因为人眼睛接受的屏幕高度是有限的。”
老刘:“东丰啊,你非常的优秀。恭喜你,你的面试过了。你回去准备一下,下周一就可以来上班了。”
再注:以上是老刘和面试者东丰的真实对话。如有雷同,请勿对号入座。
上一篇:对《Java核心技术卷一》读者的一些建议
下一篇:请用面向对象的思想,谈一谈这次面试的过程
谢谢大家的阅读,原创不易,喜欢就随手点个赞
Java面试官:兄弟,你确定double精度比float低吗?相关推荐
- 从Java面试官的角度,如何快速判断程序员的能力
临近年关,今年面试跳槽的人特别多,关注我的朋友都知道我不轻易做分享,因为这没有标准答案,看法也因人而异.但我发现有些面试问题还挺普遍的,今天就说说我做面试官这几年的经验,从面试官的角度去看面试,希望对 ...
- 大企业中,Java面试官最爱问的问题集锦(2)
Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. java 面试官:volatile的两点 ...
- 大企业中,Java面试官最爱问的问题集锦
Java编程语言是一种简单.面向对象.分布式.解释型.健壮安全.与系统无关.可移植.高性能.多线程和动态的语言.如今Java已经广泛应用于各个领域的编程开发. Java 面试官:说的还可以,那你知道v ...
- 如果你是一个Java面试官,你会问哪些问题?
作为一名年近40的大龄IT从业人员,在上市公司当经理兼创业公司当总监,从面试上来说也算是阅人无数了吧,所以谈谈个人作为Java面试官,我一般会问的一些问题,希望对你有所收获. 一.请自我介绍 我一般面 ...
- 知乎高赞:如果你是一个 Java 面试官,你会问哪些问题....
注:本文内容选自公众号<Java面试题精选>,内容比较丰富,帮助大家做面试前的准备,可以省不少时间.欢迎收藏点赞,也欢迎去围观原号主! 不断收集整理,汇总网上面试知识点,方便面试前刷题,希 ...
- 跟Java面试官对线的一天!唬住就要50K,唬不住就要5K
个人面经 前言 JVM篇 计网篇 Java基础篇 多线程篇 Spring框架篇 MyBatis框架篇 MySQL篇 Redis篇 分布式.微服务篇 小结 前言 不积跬步无以至千里,不积小流无以成江海 ...
- Java面试官:给Java面试者的八点建议
作者:hsm_computer www.cnblogs.com/JavaArchitect/p/10011253.html 在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标 ...
- 假如我是JAVA面试官,我会这样虐你
又是金三银四的时候,我希望这份面试题能够祝你一臂之力! 自我和项目相关 1.自我介绍 2.你觉得自己的优点是?你觉得自己有啥缺点? 3.你有哪些 offer? 4.你为什么要离开上家公司?你上家公司在 ...
- Java面试官最爱问的垃圾回收机制,这位阿里P7大佬分析总结的属实到位
可达性分析算法:判断对象的引用链是否可达 可达性分析算法是通过判断对象的引用链是否可达来决定对象是否可以被回收. 可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,通过一系列的 ...
最新文章
- ospf路由 华3_「分析」大型企业中必用的动态路由OSPF
- [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(四) -- 安装bitbucket 5.7.0
- Miner3D Enterprise 企业版
- poj3669 Meteor Shower(预处理+bfs)
- 实现秒杀的几个想法(续)
- windows系统c++多线程开发
- JDK源码解析之 java.lang.Integer
- java8 list 行转列_太赞了,Intellij IDEA 竟然把 Java8 的数据流问题这么完美的解决掉了!
- oracle表设计实践,Oracle数据库实训报告.docx
- 利用matlab绘制函数图像
- 各种陷进,盘点那些坑你没商量的JDK方法
- 如何扩容LVM逻辑卷
- Struts2之国际化
- 设计模式之组合模式——Java语言描述
- 学会提问pdf_原来只要1分钟,Word、PPT、PDF文件就能随意互相转换,快学学
- BLOB/TEXT column 'name' used in key specification without a key length
- Android O、N版本修改dex2oat编译选项,减少占用ROM空间或者加快安装速度
- VBA运行将多个excel的矩阵类型数据转为向量数据
- mysql删去root用户无法登录_MySQL误删root用户导致无法登陆解决方法
- Linux 线程结束的善后处理