FLOOR関数 - 時間の切り捨てと、桁落ち注意 [Excel関数リファレンス]

 

[書式] FLOOR(<数値>,<基準値>)

 

[機能] <数値> を <基準値> の倍数に切り捨てます。

 

<数値>  切り捨てをおこないたい数値を指定します。
<基準値>  倍数の基準となる数値を指定します。
[引数]

 


 

●●● 時間を10分ごとに切り捨てる方法 ●●●

 

今回は、時間の切り捨てについて考えていきましょう。

 

普通の数値の切り捨てなら ROUNDDOWN関数ですが、時間の場合には、そうはいきませ

ん。 たとえば1時間単位で切り捨てたいなら、1時間のシリアル値である 1/24 、すなわち

0.041666667 の倍数に切り捨てる必要があります。

 

さて、Excelには、FLOOR関数という、数値を任意の数値の倍数に切り捨てる関数があり

ます。 たとえば値を 0.25 ごとに切り捨てたければ、

  =FLOOR(<数値>,0.25)

のように利用します。

 

こうすれば、<数値> が

  「1.3」 だったら、計算結果は 「1.25」

  「0.7」 だったら、計算結果は 「0.5」

というように、0.25の倍数に切り捨てることができます。

 

この関数をうまく利用すれば、時間の切り捨てもできそうですね。

 

 

それでは例題として、これまで何度か出てきた次のシートを使って、「勤務時間数」を10分単位

で切り捨てる方法を考えていきましょう。 

 

floor関数1_1.jpg

 

10分単位で切り捨てたいので、まず 「10分」 がシリアル値でいくつになるかを求めなければ

なりません。 時分秒からシリアル値を求めるには、TIME関数が便利でしたね。 この関数

を使って10分をシリアル値に変換するには、

  =TIME(0,10,0)

という計算式が考えられます。

 

これを FLOOR関数に利用して、 

  =FLOOR(<切り捨てたい時間>,TIME(0,10,0))

とすれば、10分ごとの切り捨てができると考えられます。

 

ところで、Excelには、

  「時間をあらわす文字列は、適宜、内部で時間のシリアル値に自動変換される

という仕組みが備わっています。 

 

そこで、同じことを 

  =FLOOR(<切り捨てたい時間>,"0:10:0") 

という計算式でおこなうこともできます。 

 

ということで、さっそく次の計算式を セルE6 に入力し、セルE15 までコピーしてみましょう。

  =FLOOR(D6-C6,"0:10:0") 

floor関数1_2.jpg

 

 

 

●●● 正しく計算されないのは??? 桁落ち ●●●

 

すると、次図のような結果になります。 

一見、計算できたように思えますが、よくみると、正しない部分があります。 

 

floor関数1_3.jpg

 

本来なら 「1:00」 という結果になるところが 「0:50」 となっています。 

考え方は正しいはずなのに、正しく計算されないのです。

 

これは、「桁落ち」という、コンピュータ特有の現象によるものです。

 

ご存じのように、コンピュータの内部での計算は、二進数でおこなわれます。 このことは、

整数を扱う場合には特に問題になりません。

 

ところが、小数はどうでしょうか。 小数を二進数に直すと、多くの数でいつまでも続く無限

小数にります。 そして演算が行われる際に、有効数字が減少して誤差が生じることがあ

るのです。 これを 「桁落ち」 と呼んでいます。

 

この時間の切り捨てでの計算誤差は、この桁落ちによるものと思われます。 つまり、

 

「 "15:00" から "14:00" を引いたら、桁落ちによって "1:00" にわずかばかり足りなくなった。

 それをFLOOR関数で10分単位で切り捨てたので、50分という計算結果になってしまった」

 

と考えられるわけです。

 

 

●●● 時間の切り捨てを正しく計算するには ●●●

 

コンピュータの性質上やむを得ない現象ですが、でもだからといって、こんな計算違いが起こる

まま使うわけにはいきません。 では、どうしたらいいか。

 

時間の計算を自力でおこなう。 つまり、TEXT関数で文字列に変換して、コロンで分割して

60で掛けたり、割ったり、剰余を求めたり、なんていう方法もありますが、ちょっと面倒です。

 

ということで、

 

  「足りないんなら、1秒足しちゃいましょう!

 

なんていうおおざっぱなテクニックを考えるわけです。 このケースでは、計算は分までで、

秒は問題にしていません。そこで、たとえ1秒足したとしても、その後に FLOOR関数で

切り捨ててしまうので、問題は出ないと考えられます。

 

そこで今度は、セルE6の計算式を次のように変更して、セルE15までコピーしてみましょう。

 

  =FLOOR(D6-C6-"0:0:1","0:10:0") 

 

floor関数1_4.jpg

 

すると、今度は正しい計算結果が得られたはずです。

 

このように、小数の計算には意外な落とし穴がひそんでいます。 状況に応じて、きちんと

桁落ちの現象に対応することも、時には必要です。 

 

  「精密な計算をするわけではないから、桁落ちなんて関係ない」

 

と決めつけるのは早計です。 時間の計算も、Excelの内部では精密な小数の計算なの

ですから。