Java面试官:兄弟,你肯定double精度比float低吗?

我有一个朋友,叫老刘,戴着度数比我还高的近视镜,显得格外的“程序员”;穿着也很是“不拘一格”,上半身是衬衣西服,下半身是牛仔裤运动鞋。html

我和老刘的感情很是好,每周末咱们都要在一块儿吃顿饭。这周,咱们吃的是洛阳有名的吴家刀削面,席间他聊了一件蛮有趣的面试经历;我听得津津有味。java

散席的时候,老刘特地叮嘱我把他和面试者的对话整理一下发出来,由于他以为这段对话很是的精彩,值得推荐给更多初学Java的年轻人。程序员

注:如下是老刘和面试者东丰的真实对话。若有雷同,请勿对号入座面试

老刘:“东丰,你长期从事金融软件的开发,记录存款和金额之类的有关数据用哪一种数据类型啊?”数组

东丰:“固然用float啊,精确度比double高嘛。”函数

老刘:“东丰,你肯定double精度比float低吗?”code

东丰:“那固然啊,double只精确到小数点后两位,double这个单词的意思不就是二的意思吗?”htm

老刘:“东丰,你右手边恰好有一本《Java核心技术卷1)》,你翻到第35页,看一下。”对象

东丰:“......哦,刘经理,不用了。很差意思,刚刚开个玩笑,为了缓和一下面试的紧张气氛。看您厚厚的眼镜片下藏着一双深邃的眼睛,我以为您必定大有学问。在金融计算中,必需要使用BigDecimal,double和float都不适合。由于单单一个精度问题就能把人整晕了。”ci

“我记得有一次,我碰巧要计算一个表达式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还剩下一、三、4,c中不含d中元素,因此不用剔除。剔除后b中还剩下一个4,d中是一个2。再次遍历剔除a中的4。最后a和c中只剩下1和3了,再分别剔除互异的数就好了。”

“我以为比较笨的做法,刘经理您以为可行吗?”

老刘:“可行,没有问题。那,你对变量和方法的命名有什么见解呢?请随意发挥啊。”

东丰:“我在博客园上曾看到一个有意思的投票统计——选出日常工做时本身认为最难的事情,选项大体有:”

  • 写各类文档
  • 与客户沟通
  • 预估工做量
  • 给变量命名

“投票结果彻底出乎个人意料,排在第一的居然是‘给变量命名’!变量命名实在是软件开发中最多见的一件事了,但这件事要想作好,还真是不容易啊。”

“阿里巴巴Java开发手册中「强制」规定,方法名、参数名、成员变量、局部变量要统一使用lowerCamelCase风格,必须听从驼峰形式。”

localValue // 变量
getHttpMessage() // 方法

“有很长一段时间,我老是在纠结到底是用拼音好仍是用英语单词好的问题。后来我下定了决心:要么用拼音要么用英语单词,只要看到名字就能知道这个变量或者方法的用意就好了。”

“有时候,确实很难给变量取一个好名字。这时候,我就会选择一种省时省力省心的作法——将变量名命名为类型名。好比说:”

Map map;
List list;

“最好,变量声明的地方要离第一次使用的地方近。不然的话,代码阅读起来会很困难,由于人眼睛接受的屏幕高度是有限的。”

老刘:“东丰啊,你很是的优秀。恭喜你,你的面试过了。你回去准备一下,下周一就能够来上班了。”

再注:以上是老刘和面试者东丰的真实对话。若有雷同,请勿对号入座


上一篇:对《Java核心技术卷一》读者的一些建议

下一篇:请用面向对象的思想,谈一谈此次面试的过程

谢谢你们的阅读,原创不易,喜欢就随手点个赞?,这将是我最强的写做动力。若是以为文章对你有点帮助,还挺有趣,就关注一下个人公众号「沉默王二」。