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


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

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

 

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電子表格時遇到的其中一部分有趣的內容,相信大家也遇到過什么比較奇妙的計算錯誤,歡迎留言吐槽。 

拓展閱讀

實戰了解如何在純前端表格中應用各種Style,各種快捷功能,讓你在工作中更加高效地玩轉在線表格。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM