第192期(106年7月)│行政院人事行政總處公務人力發展中心發行
│發行人:城忠志

各期電子報    訂閱/取消電子報

習藝增能(14)— 人事資料該如何解決除不盡的尾數?… 蕭丞舜


  在許多資料處理的場合內,例如待遇、福利、保險、退休、撫恤等給與有關的部分,經常會遇到除不盡的尾數,然而在只能給付整數的前提下,這些尾數該如何處理呢?


  最基本的就是要先確定有沒有法令依據,如果沒有,是不是有前例可循?若連案例都沒有,只能靠法理。也就是所謂的「有法依法,無法則援例,若無法又無例,只好靠法理。」


  目前我國的給付項目與各類費用的提繳,處理尾數的方法大多採四捨五入法,少數會採用無條件捨去法與無條件進位法。如果是最後結果時才進行這些尾數處理方法時,那算是相當簡單,如果是在過程中就進行,請別忘了利用巢狀結構解決,使用時請多多注意運算的次序,否則得到的結果將會有容易引起爭議的誤差。


四捨五入、無條件捨去與無條件進位
  一開始示範函數的結構時,使用的函數就是四捨五入,理由是結構很簡單,使用的機會高。此一函數內只有兩個引數,第一個引數就是需要運算的資料,可以是來源資料儲存格,也可以是一個數學計算式;後一個引數則是決定要進行四捨五入的位數,例如小數點以下進行四捨五入以取得整數,則該引數為0,取至小數點1位則為-1,取至10位數則為1。


  以破月的薪俸發放為例,假設某甲為委任第五職等年功俸十級的非主管,依100年所定的薪俸標準,每月應發放薪俸總額為5,3340,現已辦理退休,生效日為當年度的7月16日,試問 7月應發放的薪俸應為若干?


  由退休生效日可知,某甲7月的在職日數共計為15日,故其應發放的金額按當月的在職日數與全月日數的比例計算,應發放金額為2,5810,函數撰寫如下:
  =ROUND(53340*15/31,0)
  如果薪資總額的儲存格為G23,亦可撰寫成:
  =ROUND(G23*15/31,0)
  當然,如果H23是已按照比例計算完的結果,也可以這樣寫:
  =ROUND(H23,0)


  或許有人會說,只要將儲存格格式設定為「數值」,小數位數設為0,一樣可以得到相同的結果,不是更容易嗎?


  如同在格式設定一文所述,如果在四捨五入之後還要進行計算,在數值格式底下,小數點以下的數值是存在的,如果以之再進行後續的計算,結果將會出錯。再強調一次,格式設定只是MS Excel自動將數值以四捨五入顯示出來的結果,實際上並未進行數值進位的計算,因此實際應用時如果還要進行後續的計算,透過數值設定並非正確的做法,使用者不可不慎。
  無條件進位法(ROUNDUP)與無條件捨去法(ROUNDDOWN)的結構與四捨五入法相同,只是對於尾數的的進位方式不同,使用時機當然要看法令規定,例如退休金的計算是小數點以下無條件進位。以上述案例示範函數的結構如下:
  =ROUNDUP(53340*15/31,0)
  =ROUNDDOWN(H23,0)


使用時機與其他應用案例
  四捨五入、無條件進位與無條件捨去,在與金額計算相關的領域,幾乎無所不在,真正要注意的是,對於整體計算方式的定義。在不同的計算步驟、順序與方式,往往存在者有1塊錢左右的誤差。以公教人員保險與勞工保險為例,二者均有自付保費與機關負擔的公付保費二部分,對於保費小數點以下的處理均採四捨五入法,惟在公付與自付保費的計算,因採取的計算步驟定義不同,如僅以常識解讀各該法律的母法,將會有上述的差異存在。


  依據勞工保險局的「保險費之計算及其公式」網頁(網址:http://www.bli.gov.tw/sub.aspx?a=FDqf%2foKEb3c%3d)所示,應繳保費總額是經四捨五入的自付保費加上經四捨五入的公付保費。至於公教人員保險,由臺灣銀行公教保險部的「公教人員保險服務>表格資料」(網址:http://www.bot.com.tw/GESSI/GetForm/Pages/default.aspx)內所提供的「保險俸(薪)給及保險費分擔計算表」下方的備註說明,其中有關公付保費的計算是先計算應繳總保費與自付保費,然後以應繳總保費減去自付保費,即為公付保費。


  乍看之下,二者並沒有什麼差別,惟實際上如果將勞保保費的計算步驟與方式套用到公保,在部分的保俸會產生1至3塊錢的差異,反之將公保的計算步驟與方式套用到勞保,也會有相似的差異存在。


  舉這二個保險的計算內容,並非要比較哪一個保險的計算才是比較好的,只是要告訴大家:進行任何的試算與計算,一定要注意所有的計算細節,包含定義、計算方式、計算順序與步驟,並且要多使用幾個案例來測試,以避免得到錯誤的結果,影響當事人權益與自己的專業形象。


  或許有人認為,四捨五入、無條件進位與無條件捨去這三個函數,只用於與金額有關的計算,屬於用途有限的函數。一如作者向來的主張,學函數不是只知道基本的應用就好,最重要的是邏輯上要弄清楚想要計算的結果為何?計算的邏輯、計算的方法與步驟到底是怎樣?只要邏輯能想明白、弄清楚,就有可能利用各種函數來解決問題。以下舉一例以明之:假設某機關學校於假日辦理活動,其上級機關規定活動當日加班時數上限為8小時,每人的加班費支付上限僅有1,000元,如有超出費用上限的時數,一律補休。在機關全員必須於當日出席辦理該活動的前提下,試問每人可支領加班費與補休時數各為若干?


  如大家所知,機關學校內每個人每小時加班費不全然一樣,而且上限僅1000元,因此必須計算每個人可支領最接近1000元的時數,再以8小時減去此一時數,才可得到補休時數。


  問題的重點就是:每個人的每小時加班費可能不一樣!該怎麼算才對?


  沒錯,可用的函數之一就是無條件捨去法ROUNDDOWN。以薪資總額為33360元的技工來說,每小時加班費為139元,最接近1000元的加班費總額為973元(也就是7小時的加班費)。所以只要以139除1000,無條件捨去小數點以下的位數,得到的整數就是可只領加班費的時數,補休時數只需要數學四則運算的減法就可知道了。現假設I欄為每小時的加班費,解答的函數內容如下:
  =ROUNDDOWN(1000/I2,0)


  當然還有其他的函數可用,例如計算商數的IMDIV函數,惟此一函數在不能整除的情形下會有小數點以下的位數存在,故必須配合只取整數的INT函數才行,撰寫的內容如下:
  =INT(IMDIV(1000,I2))
  或者簡單一點:
  =INT(1000/I2)


  與無條件捨去法相比,第二個是不是複雜了些?作者的工作原則之一就是以最簡單的方法,在最短的工作時間內完成複雜的工作,所以一定會採取第一個或第三個方法。


採用簡單的結構有利於運算效能與未來修改的彈性
  在各個篇章都介紹不少函數與應用案例,大家如果經常以之應用於工作上,應該會發現:自己一開始設想的解決方法和步驟,往往都比最後採用的方法來的複雜,為何呢?這完全是思考邏輯與計算邏輯的問題。


  以前述定額加班費與補休時數的問題為例,一開始作者構思解法時,認為這是個單純的計算問題,因此只要除法和取整數就好。深入一點去分析,其實只有「取整數」這個步驟才無法靠單純的四則運算解決,在MS Excel內自然只能依靠函數。


  「找出哪一個步驟才需要應用函數」,在運用MS Excel進行的計算與試算是非常重要的,要說是函數應用的核心關鍵,一點也不為過。找出來之後,才是決定該用哪一個函數。以前述案例而言,在正規的數學計算訓練下,第一時間想到的應該是「以1000元除以每小時的加班費,然後取整數」,假設不清楚「取整數」的函數為何,透過先前教過的尋找函數的輔助說明,應該可以找到INT這個函數,因此會得到「=INT(1000/I2)」這樣的計算結果。(當然有人會希望連除法都包含在內,所以才會有「=INT(IMDIV(1000,I2))」這個看起來好像函數功力很深厚的內容。)


  既然已能順利解決,為何作者最後會採取無條件捨去法(ROUNDDOWN)?除了對無條件捨去法較為熟悉且能得到相同結果之外,另外一個考量因素是無條件捨去法可以透過引數的變更,而迅速改變所需的計算結果,而取整數的INT顯然就沒這麼容易。


  改變計算結果,在許多試算的場合是司空見慣的事。畢竟所謂的試算,就是想知道在不同的計算條件下,究竟有哪一種條件可得到最佳的結果。如果每一次的試算都要重新撰寫函數,非只沒效率,也會將自己累死。


  根本的解決之道,自然是設計一個完整架構的試算表,將試算參數設計成容易修改的方式,也就是函數引數的相對參照。由此可知,對於INT這個只有一個引數的函數而言,修改引數就等同修改其內的計算式,自然不是那麼方便,修改彈性相對較低。


  這樣的設計概念,對於所謂的經常性、規律性的業務而言是很重要的,其重要性表現在業務效能上。因為這意味著只要辛苦一次來設計,之後只需要針對狀況有所變化得部分,進行局部修改就可得到需要的結果,和每次都要重頭來,自然要迅速許多。


  此處僅先以這個案例做一個簡單說明,讓大家有個概念,未來在討論如何以系統設計概念應用於經常性、規律性業務,將會有更完整、深入的說明。


(作者為臺北市立南湖高級中學人事室組員)

 

 

 

 

 

 
民國86年1月創刊,95年2月改版為電子版  
10660臺北市大安區新生南路3段30號 電話:(02) 8369-1399 轉 8308 研究組