【Excel関数】五捨六入の式|0円ガードの落とし穴

五捨六入を式で書く。ROUNDUPで0.5を引く式と、0.3が0になる例を示したコード風の画像 Excel関数

給与から社会保険料を控除するときなど、金額の端数を「50銭以下は切り捨て、51銭以上は切り上げ」にしたいことがあります。いわゆる五捨六入です。

ExcelのROUND関数は四捨五入なので、端数がちょうど0.5のときだけ結果が逆になります。ROUNDUPとROUNDDOWNは、端数が何であっても一方向に動かします。五捨六入そのものを返す関数はありません。

この記事は、給与計算の処理でこの端数処理をExcelの式で書くのに困っている人向けです。式の書き方と、境界の値で何が返るかを実機で確かめた結果をまとめます。どの項目にどの端数処理を使うかは、法令や労使の取り決めで決まるものなので、扱いません。

先に結論

金額がB2にある場合、次の式です。

=MAX(0,ROUNDUP(B2-0.5,0))

0.5を引いてROUNDUPで切り上げ、0を下回ったら0にします。金額は0以上を前提にしています。

=IF(B2=0,0,ROUNDUP(B2-0.5,0))では足りません。0.5円より小さい金額で-1が返ります。

ROUND・ROUNDUP・ROUNDDOWNでは書けない

金額ROUNDROUNDUPROUNDDOWN五捨六入(目標)
10.4910111010
10.511111010
10.5111111011
1234.51235123512341234

ROUNDは10.5を11にします。ちょうど0.5の金額だけが、目標とずれます。

0.5を引いてROUNDUPする仕組み

先に0.5を引いてから、ROUNDUPで整数に切り上げます。

  • 10.51 → 10.01 → 11
  • 10.5 → 10.00 → 10
  • 10.49 → 9.99 → 10

ちょうど0.5の金額は、引くと整数になるので切り上がりません。0.5を超える金額だけが、次の整数に上がります。0.500001は1、0.499999は0、2.500001は3、2.499999は2になりました。ROUNDUP関数の書式は、MicrosoftサポートのROUNDUP 関数のページで確認できます。

なお、丸めを行う順序で結果が変わる例は、【Excel関数】時間の丸めは順序で結果が変わる理由と対処で扱っています。

0円ガードは「ちょうど0」では足りない

ROUNDUP(0-0.5,0)は-1になります。ROUNDUPは0から遠ざける方向に丸めるためです。そこでIF(金額=0,0,…)というガードを付けがちですが、守れるのはちょうど0だけです。

金額IF(金額=0,0,…)MAX(0,…)目標
0000
0.3-100
0.49-100
0.499999-100
0.5000

0.01から0.499999までの金額で-1が返りました。ガードの条件は「0」ではなく「0.5以下は0」です。MAX(0,…)なら、この条件を式の中に含められます。

Excelのシート。金額0から10.51について、ROUND・ROUNDUP・ROUNDDOWN・IF版・MAX版の結果を並べた表。0.3と0.49でIF版だけが-1になっている
再現用の最小コードの実行結果(IF版だけが、0.3と0.49で-1になる)

計算結果が.5ちょうどにならないとき

時給と時間の掛け算では、正しい値が27.5でも、セルの値が27.500000000000004のように、わずかにずれることがあります。25×1.1がその例です。

そこで、8つの掛け算(25×1.1、1024.4×3.75、1025.4×7.5、45×1.1、1024.6×7.5、1027.6×3.75、0.1×5、3×0.5)で確かめました。正しい値が.5ちょうどになる組み合わせです。セルの値は、正しい値より上に最大9.1E-13、下に最大9.1E-13ずれていました。それでも、MAX(0,ROUNDUP(金額-0.5,0))は、8つとも目標どおりに返しました。Excelでは、セルの値と正しい値の比較がTRUEになり、引き算も0になりました。ROUND(金額,2)で先に丸める必要はありませんでした。この結果は今回の環境のものです。他のバージョンとMac版は未検証です。

空欄と文字列

金額が空欄なら、IF版・MAX版とも0を返します。文字列(abc)が入っているときと、空文字を返す数式のときは、どちらも#VALUE!になります。エラー値の見方は、【Excel関数】#N/A・#VALUE!・#REF!が出たら最初に確認で整理しています。

まとめ

  • 五捨六入は、0.5を引いてROUNDUPで書けます
  • 0.5以下の金額が-1にならないよう、MAX(0,…)で守ります
  • 掛け算の結果が.5前後にずれても、今回の環境では結果は変わりませんでした

検証した環境は、Excel 16.0(Build 20527)・Windows 64bit・日本語版です。他のバージョンとMac版は未検証です。

コメント

タイトルとURLをコピーしました