盤點Excel中的那些有趣的“bug”

葡萄城技術團隊發表於2021-03-05

本文由葡萄城技術團隊原創並首發

轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。

 

Excel 1.0早在1985年正式進入市場,距今已經有36年了,雖然在推出時市面上已經有了類似軟體Lotus 1-2-3,但Excel仍然憑藉著其對競品在功能上的全面超越,再加之和Windows環境的直接捆綁,直接將Excel推向了電子表格辦公軟體的王者的地位。

但在今天這篇文章裡,我們不是為了講Excel中那些大家已經耳熟能詳的功能,讓我們一起來看看,即便強大如Excel也會有的一些令人費解的計算結果吧!

 

1900年2月29日 

小學生都知道在我們現在使用的公曆(格里高利曆)中規定:年份是4的倍數,且不是100的倍數的,為閏年;年份為100的倍數,必須是400的倍數才是閏年。 

 

 

 

那麼1900年並不滿足上述條件不是閏年,但是在Excel中卻存在1900年2月29日這天,通過拖拽填充的方式,可以看到2月28日之後是29日。是因為Excel還在使用4年一潤的儒略曆嗎?經過測試在Excel中並不存在2100年2月29日,那為什麼只有1900年這一天錯了? 

Excel官方給出過回覆,這是Excel前身Lotus 1-2-3的一個bug,但是修復問題會導致歷史檔案出現一天的誤差,出於對老檔案的相容,同時這個Bug影響很小,Excel並未修復這個bug,1900年2月29日保留至今 。

 

38/12/31是1938還是2038 

進入21世紀一個百年輪迴開始,日常中我們習慣只說年份的兩位例如1987年簡稱87年,2002年簡稱02年。在Excel中也支援2位年份的輸入,例如輸入87/12/31,自動識別為1987/1231;輸入20/12/31自動識別為,2020/12/31。可是在輸入30/12/31卻又變會1930年了,Excel按照什麼規則判斷年份呢? 

 

 

 

在這裡Excel有一個2029規則,記輸入00-29中的數字會自動識別為21世紀,其餘則是20世紀,如果想輸入29年之後的年份,就需要輸入四位數字了。當然也可以通過修改作業系統設定來改變2029這個節點,具體可參考Excel的官方說明: https://docs.microsoft.com/zh-cn/office/troubleshoot/excel/two-digit-year-numbers 。

 

兩數不相等 

在Excel中輸入=1.2-1.1=0.1,回車後計算結果為FALSE,這說明1.2減1.1的結果不是0.1,是Excel算錯了嗎?可是輸入=1.2-1.1確實顯示0.1啊。 

 

 

 

這的確是Excel算錯了,但是這個並不是Excel特有的錯誤,而是計算機2進位制特性導致的浮點數計算精讀誤差問題。簡而言之,計算機計算過程使用二進位制,對於1.2-1.1的結果為2進位制迴圈小數,在儲存時會進行小數截斷,導致出現誤差。 

如果在Excel中設定顯示位數20位就會發現實際計算值為0.09999999999999990000。 

 

 

 

通常對於誤差較小的結果,Excel可以自行修正,但是向1.2-1.1的結果Excel卻沒有處理。 

因此,在進行數值比較的時候使用ROUND是一個好習慣,可以根據業務場景涉及到的小數範圍設定引數。例如:=ROUND(1.2-1.1, 10)=0.1。 

 

 

四舍五沒入 

在上述例子中使用的ROUND函式規則是四捨五入,但是同樣因為精度問題造成了一些計算問題 。例如=ROUND((8.92-8.71)/6,2) ,結果是0.03。期待值是0.4,由於誤差計算結果並未達到0.35,並沒有五入。

 

 

 

由於計算誤差想要得到一個四捨五入的2為小數,需要進行2次ROUND,首先修正誤差,然後再四捨五入保留2位小數。對於所有操作計算都做兩次ROUND過於繁瑣,這裡可以使用Excel提供的另一個設定,使用“顯示精度”,這樣Excel在儲存計算時,會按照單元格設定的顯示小數位數來保留精度。 

 

 

 

  1. 在 "檔案" 選單上,單擊 "選項",然後單擊 "高階" 類別。
  2. 在 "計算此工作簿時" 部分,選擇所需的工作簿,然後選中 " 將精度設定為顯示" 核取方塊。

 

 

 

但是要注意,後續計算需要真實的計算結果還是格式化後的結果,不正確的使用這個功能可能會導致誤差越來越大。 

 

數字不計算 

 

如截圖,單元格中對SUM結果為0,同時單元格左上角有綠色三角提示“以文字形式儲存的數字“。這個提示就是SUM結果為0的原因,這些數字實際儲存格式為文字,而文字並不參加數字的運算。 

這裡有個概念是儲存格式,當在Excel單元格中輸入數字0,Excel預設會以數字格式作為儲存,也就是前面說的2進位制,但是如果先設定這個單元格型別為文字,則0當作文字。在Excel中數字和日期預設靠右顯示,文字靠左。 

這也是我們經常在輸入電話號碼和身份證號是存在的問題,輸入身份證號後,顯示成了科學計數法,這裡就需要先設定單元格為文字再輸入。 

總結

Excel中有很多這樣並不是很符合日常行為的操作,以上只是葡萄城在研究Excel電子表格時遇到的其中一部分有趣的內容,相信大家也遇到過什麼比較奇妙的計算錯誤,歡迎留言吐槽。 

 

相關文章