前回「Excel 切り捨て(1) INT、ROUNDDOWN、TRUNCの違い」記事に引き続き、数値の“丸め”処理・端数処理に使われる「FLOOR.MATH」関数と「FLOOR.PRECISE」関数の違いについて見ていきます。

前回見てきた「INT」「ROUNDDOWN」「TRUNC」の各関数とも 10進数の世界で使うものです。
つまり、個数などを数えていき 9を超えて 10までいくと桁が 1つ繰り上がります。
小数点以下も同様で、0.1が 10集まれば 1の位に繰り上がります。
今回ご紹介する FLOOR関数などは繰り上がる単位を 10以外のものでも対応します。

例えば、ビールや飲料水などを箱買いするとき 6本で 1カートンという単位で買います。
あるいは、鉛筆を箱買いするとき 12本で 1ダースという単位で買います。

このように、10を基数としないで数えるものは意外と多く存在します。

さて、表記の 2関数の以前に「FLOOR」関数がありました。
所謂、互換性関数と呼ばれるものの 1つです。
これも含めて、前回同様にそれぞれの関数の書式と意味合いを列記しておきます。

FLOOR関数 ‥‥ 基準値の倍数のうち、最も近い値かつ 0 に近い値に数値を切り捨てます

その書式は FLOOR(数値, 基準値) で、第1引数には丸めの対象となる数値あるいは参照セルを指定します。

Microsoftのサポートページ「FLOOR関数
ちなみに、英語「floor」は(建物の)床・階、(金融の)底値という意味で、対義語「ceiling」は天井・上限で、Excelにも「CEILING」関数があります。

FLOOR.PRECISE関数 ‥‥ 最も近い整数、または最も近い基準値の倍数に切り捨てる数値を返します

その書式は FLOOR.PRECISE(数値, [基準値]) で、第2引数は省略可能(既定値は 1)です。

Microsoftのサポートページ「FLOOR.PRECISE関数

FLOOR.MATH関数 ‥‥ 基準値の倍数のうち、最も近い値に数値を切り捨てます

その書式は FLOOR.MATH(数値, [基準値], [モード]) で、第2、3引数は省略可能です。
第2引数(基準値)の既定は 1で、第3引数(モード)の既定は 0です。

Microsoftのサポートページ「FLOOR.MATH関数

FLOOR関数は互換性関数とされていますが、後継とされる FLOOR.PRECISE関数、FLOOR.MATH関数では引数の扱いが少し違いますので、“互換”と謳ってよいか疑問が残ります。
実は、FLOOR.PRECISEは、新しいExcelでは入力の候補にも出てきません

それでは、いくつか使い方を見てみましょう。
まず、FLOOR関数です。(下図)

 

第2引数(基準値)も必ず指定します。
ただし、基準値として 0 を指定すると「#DIV/0!」エラーとなります。
また、第1引数の数値が正の値で、第2引数の基準値が負の値であると「#NUM!」エラーとなります。

少しだけ注意したいのは、上図の B6、B7セル、B9、B10セル、B12、B13セルのように第1引数の数値が負の値のとき、第2引数の基準値が正の値なのか負の値なのかにより結果が変るということでしょう。

次に、FLOOR.PRECISE関数です。(下図)

 

第2引数は省略可能(既定値は 1)ですが、これに 0 を指定してもエラーとはならず「0」と返されます。
また、第1引数の数値が正の値で、第2引数の基準値が負の値であっても FLOOR関数とは違ってエラーとはなりません。
それ以外の動作は FLOOR関数に似ていますが、少し違います。
切り捨て処理の考え方をより厳密に考えたものと理解できます。

最後に、FLOOR.MATH関数です。(下図)

 

第2、3引数は省略可能で、それぞれの既定値は 1、0です。
そのときは INT関数と同じ動作となります。
第2引数の基準値の扱いは、ほとんど FLOOR関数や FLOOR.PRECISE関数と同じなのでその説明は省略します。
第3引数のモードは他の関数にないもので、上図では 0、1、-1 であるときの例も示しておきました。
このモードは、負の数値を丸める方向、つまり 0 に向かう方向にするか、0 から離れた方向にするかを決定します。
既定値の 0 または正の値を指定したときは、0 から離れた方向に丸め、負の値を指定したときは、0 に向かう方向に丸めます。

このように、FLOOR関数、FLOOR.PRECISE関数、FLOOR.MATH関数はいずれも基準値の倍数に“切り捨て”るもので、正の数値に対してはさほど違わず使えます。
でも負の数値に対して切り捨て処理をするときに引数の与え方により違いが出てきます。
使い分けるというより、今後は FLOOR.MATH関数一択で使ったほうが要らぬミスをしなくて済むと思います。