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

我有一個朋友,叫老劉,戴着度數比我還高的近視鏡,顯得格外的「程序員」;穿着也很是「不拘一格」,上半身是襯衣西服,下半身是牛仔褲運動鞋。java

我和老劉的感情很是好,每週末咱們都要在一塊兒吃頓飯。這周,咱們吃的是洛陽有名的吳家刀削麪,席間他聊了一件蠻有趣的面試經歷;我聽得津津有味。程序員

散席的時候,老劉特地叮囑我把他和麪試者的對話整理一下發出來,由於他以爲這段對話很是的精彩,值得推薦給更多初學Java的年輕人。面試

注:如下是老劉和麪試者東豐的真實對話。若有雷同,請勿對號入座數組

老劉:「東豐,你長期從事金融軟件的開發,記錄存款和金額之類的有關數據用哪一種數據類型啊?」微信

東豐:「固然用float啊,精確度比double高嘛。」函數

老劉:「東豐,你肯定double精度比float低嗎?」spa

東豐:「那固然啊,double只精確到小數點後兩位,double這個單詞的意思不就是二的意思嗎?」code

老劉:「東豐,你右手邊恰好有一本《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;
複製代碼

「最好,變量聲明的地方要離第一次使用的地方近。不然的話,代碼閱讀起來會很困難,由於人眼睛接受的屏幕高度是有限的。」

老劉:「東豐啊,你很是的優秀。恭喜你,你的面試過了。你回去準備一下,下週一就能夠來上班了。」

再注:以上是老劉和麪試者東豐的真實對話。若有雷同,請勿對號入座

附:數組的留存代碼

import java.util.ArrayList;

public class Distinct {

	public static void main(String[] args) {
		int[] a = {1, 2, 3, 4};
		int[] b = {2, 4};
		int[] c = {1, 3};
		int[] d = {2};
		
		int[][] input = {a, b, c, d}; 
		
		//記錄每一個數組留下的惟一的元素
		ArrayList<Integer> result = new ArrayList<Integer>();
		
		//記錄每一個數組留下的惟一元素在數組中的位置
		ArrayList<Integer> index = new ArrayList<Integer>(); 
		
		int row = 0;
		int column = 0;
		do {
			boolean isBacktrack = false; //記錄當前狀態,是不是回溯
			while(column < input[row].length) {

				Integer current = input[row][column];
				//當前元素是否已存在結果集中
				boolean isContained = result.contains(current);;
				
				//若當前元素不存在結果集中,將該元素加入結果集,並遍歷下一行
				if(isContained == false) {
					result.add(current);
					index.add(column);
					column = 0;
					row++;
					break;
				}
				//若是當前元素已經存在結果集中,而且已經到達本行最後一個元素,則回溯一行
				else if(column + 1 == input[row].length) {
					result.remove(result.size() - 1);
					column = index.get(index.size() - 1) + 1;
					index.remove(index.size() - 1);
					row--; //回溯一行
					isBacktrack = true;
					break;
				}
				column++;
			}
			//若是是回溯,判斷列數是否超過該行的界限,若是超過了,再回溯一行
			if(isBacktrack && column == input[row].length) {
				result.remove(result.size() - 1);
				column = index.get(index.size() - 1) + 1;
				index.remove(index.size() - 1);
				row--; //回溯一行
				isBacktrack = true;
			}
			
		}while(row < input.length);
		
		//把 result 中的每一個元素賦給相應的數組
		for(int i = 0; i < result.size(); i++) {
			input[i] = new int[] {result.get(i)};
		}
		
		//打印每一個數組的元素
		for(int[] i: input) {
			System.out.println(i[0]);
		}
	}
}
複製代碼

沉默王二(微信ID:qing_gee),一個不止寫代碼的程序員;還寫有趣有益的文字,給不喜歡嚴肅的你。

相關文章
相關標籤/搜索