跳到主要內容跳到頁尾

數字捨入函式參考:ROUND、INT、TRUNC、CEILING、FLOOR 與負數的方向

8 分鐘閱讀Lv.2 中級摘要與日期

ROUND、ROUNDUP、ROUNDDOWN、INT、TRUNC、CEILING、FLOOR、MROUND、CEILING.MATH、FLOOR.MATH、CEILING.PRECISE、FLOOR.PRECISE、ISO.CEILING、ODD、EVEN 共 15 個捨入函式的語法與例子,並整理負數時各函式往哪個方向走,以及用 ROUND 收掉浮點誤差。

發布 更新

文章目錄

五個商品的含稅價,每格都設成「顯示 0 位小數」,我用眼睛加起來是 347,SUM 卻給我 349。

這篇整理 Google 試算表裡 15 個把數字「收一收」的函式,重點放在兩件事:負數時它們各往哪個方向走,還有什麼時候該用 ROUND 把值真的改掉,而不是只改顯示。

加總對不起來的時候

先看資料。未稅價乘 1.05 變含稅價,含稅價那一欄的格式調成 0 位小數,「畫面顯示」是同一欄的外觀,不是另一欄:

品項未稅價含稅價實際值畫面顯示ROUND 後
蘋果紅茶茶葉8892.49292
青茶茶葉8488.28888
烏龍茶葉4345.154545
茶杯4951.455151
茶壺6871.47171
合計348.6349347

畫面上五格是 92、88、45、51、71,手算是 347。但 SUM 用的是底下真正的 348.6,顯示出來就是 349。差了 2 塊,對帳的時候最容易吵起來。

格式只改顯示,儲存格裡的值沒變。這件事在 儲存格的值與顯示格式 有完整講過,這邊只講結論:要讓值真的變成整數,得用函式。

如果要用 ROUND 寫,每格改成:

Google 試算表公式
fx

含稅價四捨五入到整數,D2 往下填

=ROUND(B2*1.05, 0)

五格算完是 92、88、45、51、71,加總 就是 347,跟手算對得上。

負數的方向

正數的時候,這幾個函式大多給一樣的答案,差別在負數。我用 2.5 和 -2.5 各丟一次,位數或倍數都取 0 位、倍數 1:

函式2.5-2.5負數往哪走
ROUND(x, 0)3-3離 0 遠的那邊
ROUNDUP(x, 0)3-3離 0 遠
ROUNDDOWN(x, 0)2-2靠近 0
TRUNC(x)2-2靠近 0
INT(x)2-3負無限大
FLOOR(x, 1)2-3負無限大
CEILING(x, 1)3-2正無限大

最容易搞混的是 INT 跟 TRUNC。都叫「取整數」,正數一模一樣,到了 -2.5 一個給 -3、一個給 -2。

我的記法:名字有 UP、DOWN 的(ROUNDUP、ROUNDDOWN)看的是離 0 遠或近,所以負數會跟著正數對稱。INT、FLOOR、CEILING 看的是數線上的左右,往小的那邊就是往負的那邊。

表中 FLOOR、CEILING 的方向,是倍數為正(這裡是 1)時的行為。數字是負的、倍數也給負的組合很少見,而且要小心:CEILING 的官方說明寫,數值為負時倍數可以正也可以負,由倍數的正負決定進位方向,所以負倍數不一定還是往正無限大;FLOOR 的官方說明頁對倍數正負的規則前後不一致。需要處理負數的話,用下面的 CEILING.MATH、FLOOR.MATH,它們可以用第三個參數指定負數要往哪邊走。

浮點誤差

二進位浮點數不能精確表示所有十進位小數;畫面顯示與後續比較也可能不同。不要把其他程式語言顯示的尾數直接當成 Sheets 會顯示的字串。

平常看不出來,一旦拿去比較就出事:

Google 試算表公式
fx

畫面可能顯示0,仍要分開核對比較結果

=0.1+0.2-0.3

原式與 TO_TEXT(0.1+0.2-0.3) 都顯示 0,但 為 FALSE。因此條件式 會落到「不相等」;不能只靠畫面上的 0 判斷計算是否完全相等。

同一格改到「格式」>「數字」>「工程型」,會看到 5.55E-17;相較之下,在自動格式下,原式與 TO_TEXT 都顯示 0。改格式只是讓尾差可見,沒有把底層值變成 0。

這種比較前先 ROUND 一下就好:

Google 試算表公式
fx

比較前先收到 10 位小數

=ROUND(0.1+0.2-0.3, 10)

結果是 0。位數我習慣抓比資料需要的多幾位,金額收 2 位的話,比較時收到 8 或 10 位都夠用。

函式參考

ROUND

四捨五入到指定的小數位數。

  • 數值:要處理的數字。
  • 位數:選填,預設 0。正數是小數點後幾位,負數是小數點前幾位。

用 1234.5678 看不同位數:

公式結果
1234.57
1235
1230
1200

剛好在中間的 2.5,ROUND 往離 0 遠的方向進,所以 2.5 變 3,-2.5 變 -3。文字丟進去會是 #VALUE!。

我寫報表時用最多的就是它,其次才是 ROUNDUP。

ROUNDUP

不管後面的數字是多少,只要有就往上進,往離 0 遠的方向。

53 個商品,一箱裝 12 個,要幾箱:

Google 試算表公式
fx

不足一箱也要整箱買

=ROUNDUP(53/12, 0)

53 ÷ 12 = 4.4166⋯⋯,結果是 5。

位數一樣可以用負數: 是 1300。

ROUNDDOWN

跟 ROUNDUP 相反,一律捨去,往靠近 0 的方向。

消費 1250 元,每滿 100 元一點,可以拿到幾點:

Google 試算表公式
fx

不滿 100 的零頭不算

=ROUNDDOWN(1250/100, 0)

結果是 12。 是 2.3, 是 1200。

INT

取小於或等於這個數字的最大整數。

是 8, 是 -9。正數的時候它跟 ROUNDDOWN(x, 0) 一樣,負數就分家了,前面的表格已經對照過。

它沒有位數參數,只能收到整數。

TRUNC

把小數位砍掉,不做任何進位。

  • 位數:選填,預設 0。

是 8.9, 是 -8.9, 是 1200。

TRUNC 對任何正負數的行為都跟 ROUNDDOWN 一樣,差別只在名字。我想要「直接砍掉小數」的意思時會選 TRUNC,讀公式的人比較容易懂。

CEILING

進位到指定倍數的整數倍,倍數為正時往正無限大。

  • 因數:選填,預設 1。數值為正時,因數必須是正數;數值為負時,因數可正可負,由它決定進位方向(官方說明)。

停車 75 分鐘,每 30 分鐘計一次費:

Google 試算表公式
fx

75 分鐘進位到 30 的倍數

=CEILING(75, 30)

結果是 90,除以 30 就是 3 個計費單位。 是 300, 是 10。

FLOOR

跟 CEILING 相反,捨去到倍數的整數倍,倍數為正時往負無限大。

消費 1237 元,每滿 500 元送一份贈品:

Google 試算表公式
fx

1237 捨去到 500 的倍數

=FLOOR(1237, 500)

結果是 1000,除以 500 是 2 份。

MROUND

四捨五入到最接近的倍數,不管往上或往下,看哪邊近。

兩個參數都要填。跟 CEILING 比比看,同樣是以 30 為倍數:

公式結果原因
6070 離 60 近
90一律往上
9080 離 90 近

官方說明寫,數字跟因數的正負號必須相同,不同就會出錯。需要時兩個都用負數,或先 ABS 再補回負號。數字剛好落在兩個倍數正中間時,取絕對值較大的那個,例如 是 28。

CEILING.MATH

跟 CEILING 一樣往上進位到倍數,但負數的方向可以自己選。

  • 倍數:選填,預設 1。
  • 模式:選填,預設 0。數字是負數時,0 往正無限大進,非 0 則往離 0 遠的方向進。
公式結果
10
-5
-10

FLOOR.MATH

CEILING.MATH 的反方向。

數字是負數時,模式 0 往負無限大捨,非 0 則往靠近 0 的方向捨。

公式結果
5
-10
-5

CEILING.PRECISE

往正無限大進位到倍數的整數倍,而且不管倍數是正是負,都當作正的來算。

  • 倍數:選填,預設 1。正負號會被忽略。
公式結果
10
-5
10
-5

四個結果的規則只有一條:一律往正無限大走,-7.2 的下一個 5 的倍數是 -5。數值為正卻給負倍數,CEILING 的官方說明並不允許,這個函式就不用擔心。負數的結果和 CEILING.MATH 預設模式一樣。

ISO.CEILING

名字帶 ISO,行為和 CEILING.PRECISE 相同,是為了相容規格而存在的名稱。

我自己沒有理由選它,要用這種語意就直接寫 CEILING.PRECISE,同事比較看得懂。

FLOOR.PRECISE

CEILING.PRECISE 的反方向:往負無限大捨去到倍數的整數倍,倍數的正負號同樣被忽略。

公式結果
5
-10
5
-10

-7.2 往負的方向,下一個 5 的倍數是 -10。結果和 FLOOR.MATH 預設模式一樣。

ODD

進位到最接近的奇數,離 0 遠的方向。

是 3, 是 3, 是 3。

坦白說我沒在工作裡用過,丟在這邊當作完整名單。

EVEN

進位到最接近的偶數,離 0 遠的方向。

是 2, 是 2, 是 4。

實際用到的場合是兩人一桌的排位:7 個人要湊成整桌, 是 8 個位子。


要挑哪一個,我的順序是:只是想收小數,先 ROUND;一定要進位或一定要捨去,換 ROUNDUP、ROUNDDOWN;要湊倍數才用 CEILING、FLOOR。算完的欄位如果要拿去加總或比較,記得用 ROUND 把值改掉,只調格式是擋不住差 2 塊的。接下來可以搭配 SUMIF 與 COUNTIF,先加總再收尾數。

分享:
#ROUND#捨入#無條件進位#浮點誤差#數字處理
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

這篇在技能樹的 Lv.2「進階分析」,模組「處理與分析數字」(第 1/1 篇)。讀完這篇,路線上的下一個模組是「計算排名與百分位數」。

回到技能樹

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。