Excelの端数処理が列によってバラバラだった。自動集計を始めて初めて気づいた、毎月数百円ズレる集計の正体

自動集計に切り替えた途端、毎月数百円ズレるようになった

「関数を使っているのだから、計算が間違っているはずがない」。そう信じ切っていた時期が私にもあった。経理部門や総務部門において、Excelの自動集計は信頼の象徴です。手計算というアナログな儀式から解放され、計算式をセルに打ち込みさえすれば、後はExcelが正確無比な数字を導き出してくれる。長年事務職として働いてきた私は、そう信じて疑わなかった。

しかし、その信頼は、ある月の月末に脆くも崩れ去った。いつものように月次の交通費と経費を合算し、出力された合計金額を眺めていたときのことです。ふと、前月までの手計算による推移と見比べ、違和感を覚えた。いつもなら誤差など存在しないはずの「自動計算結果」が、手元のメモ帳に残した電卓の叩き値と数円どころか、数百円単位で乖離しているのです。

「数字が合わないんだけど?」

上司からの冷ややかな問いかけは、今でも耳に残っている。自動集計に切り替えてからというもの、入力の手間は大幅に減ったはずだった。しかし、その結果として出てきた数字の信憑性は、手計算をしていた時代よりも下がってしまった。なぜ、Excelは嘘をつくのか。いや、Excelが嘘をついているわけではない。私が組み上げた数式のどこかに、爆弾が埋め込まれていたのです。

原因究明のために、私は膨大なシートと向き合った。数式を一つずつ確認していくと、驚愕の事実が浮かび上がった。交通費精算の列にはROUND関数が、物品購入の列にはROUNDDOWN関数が、そしてその他の経費にはTRUNC関数が、まるでパッチワークのように混在していたのです。さらに悪いことに、同じ経費項目内であっても、行によって使用されている関数が微妙に異なっている箇所があった。

これは、Excelを使い始めた当初、その時々の気分やネット検索で得た情報を「とりあえず」適用し続けた結果だった。例えば、あるセルでは「四捨五入しなきゃ」と思ってROUNDを使い、別のセルでは「切り捨ての方が安全です」という噂を信じてROUNDDOWNを使っていた。この「なんとなく」が、全社的な集計プロセスの中で大きな歪みを生んでいたのです。1行あたりの誤差は最大でも0.4円程度だが、200行という規模になれば話は別です。積み重なった誤差は350円にも膨れ上がり、それはもう無視できない「金額的な差異」として顕在化していた。

日本語版Excelで交通費精算の合計が手計算と数百円ズレているスクリーンショット。ROUNDとROUNDDOWNの混在が原因。

ROUND・ROUNDDOWN・TRUNCは何が違うのか。同じ値で試してみた

この惨状を招いた直接的な原因は、私自身が各関数の「数学的な挙動」を深く理解していなかったことにある。Excelには端数処理を行う関数がいくつも存在するが、それらは決して同じ目的のためのものではない。まずは、主要な3つの関数について、実際の動作を整理しておく必要がある。

比較のために、値として「2.5」と「-2.5」をそれぞれ小数点以下第1位で処理するというケースを想定してみよう。

ROUND関数は、一般的な四捨五入を行う関数です。ROUND(2.5, 0)の結果は3となる。これは多くの人が直感的に理解する処理です。一方、ROUNDDOWN関数は、その名の通り常に値を切り捨てる。ROUNDDOWN(2.5, 0)の結果は2です。そしてTRUNC関数は、指定した桁数よりも下の数値を強制的に削除する。TRUNC(2.5, 0)の結果は2となる。正の数だけで見れば、ROUNDDOWNとTRUNCに大きな違いはないように見える。しかし、これが負の数になった瞬間に、罠が顔を出す。

ROUND(-2.5, 0)は、-3となる。四捨五入という概念に基づけば、絶対値側で処理されるためです。ここまでは予想通りだろう。しかし、問題はここからです。ROUNDDOWN(-2.5, 0)を実行すると、結果は-3となる。0に近い方へ切り捨てるのではなく、より小さい(マイナスの値として絶対値が大きい)方向へ向かって切り捨てるからです。これに対し、TRUNC(-2.5, 0)を実行すると、結果は-2となる。TRUNCは「小数点以下の数値を単に消し去る」という挙動をとるため、負の数であっても絶対値が小さくなるような処理が行われるのです。

この挙動の違いが、経費精算における「予算差異分析」などで致命的なズレを発生させる。例えば、マイナスの値を扱う補正処理や、キャンセルによる返金処理が発生した際、どの関数を使うかによって合計値が数円単位で変動してしまう。私は、この関数ごとの特性を理解しないまま、その場の思いつきで使い分けていたのです。これが「関数を使っているから正しい」という傲慢な過信を生み、結果として業務の信頼を損なうことになった。

日本語版ExcelのROUND、ROUNDDOWN、TRUNC関数の計算結果を並べて比較した日本語の表。

列ごとに関数が違うと、誤差が行数分だけ積み上がる

なぜこれほどまでに誤差が積み上がったのか。それを理解するには、単純な算数の世界を超えて、Excelの「セルの積み上げ」という特性を考慮する必要がある。

200行にわたる交通費精算のリストを想像してほしい。各行で、例えば「実際の運賃の小数点以下」が発生し、それを端数処理するルールがバラバラに混在していたとする。ある行では「0.4円」が切り捨てられ、別の行では「0.4円」が四捨五入によって「1円」として計上される。この「0.6円」という差分が、100行分続けばどうなるか。理論上、最大で60円近い誤差が、何の説明もつかないまま合計金額に紛れ込むことになる。

これが何百行、あるいは部署を跨いだ統合シートになれば、誤差はさらに増幅する。私が直面した「350円のズレ」は、まさにこの「端数処理の不一致」が200行という母数によって増幅された結果であった。手計算の時代には、電卓を叩く人間がその都度、頭の中で「今回は切り捨てでいこう」という暗黙の統一ルールを適用していたため、誤差が固定化されていた。しかし、自動集計では数式が厳格に働く。人間が曖昧にしていた部分を、Excelは冷徹な論理で計算し、その結果として「計算上の不整合」という形で突きつけてきたのです。

ここで重要なのは、どちらの計算が「正しいか」という議論ではない。会計の世界では「どちらのルールを採用するか」を合意し、それを一貫して適用することこそが重要です。列ごとに、あるいは担当者ごとに勝手な関数を使うことは、計算の根拠そのものを壊す行為に他ならない。私はこの事実を突きつけられたとき、ただ単に数式を修正するだけでなく、全社的な「端数処理ルール」を策定しなければならないという使命感に駆られた。

まずは、シートの数式を可視化することから始めた。Excelの「数式の表示」モード(Ctrl+Shift+@)を使い、すべてのセルを一気に眺める。そこには、ROUND、ROUNDDOWN、TRUNCが混沌として混ざり合っている様子が見えた。まるで雑草が生い茂った庭のように、整理されていない数式が並んでいた。私は一つずつ、すべての列の性質を確認した。交通費は切り捨てなのか、それとも四捨五入なのか。消費税の計算ルールはどうなっているのか。一つ一つのセルを再定義する作業は、まさに汚れた庭を掃除するような泥臭い作業だった。しかし、このプロセスを経ることなしに、信頼を取り戻すことはできない。

負の数におけるROUNDDOWNとTRUNCの動作の違いを日本語で解説する図。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

切り捨てにするか四捨五入にするか。統一基準を決める判断軸

端数処理のルールを統一する際、まず直面するのは「切り捨てにするか、四捨五入にするか」という問いです。これは単なる好みの問題ではない。業種や取引の内容によって、どちらが「一般的」かが決まってくることが多いからです。

例えば、建設業界や公共事業に関連する契約では、金額の端数は「切り捨て」とされることが多い。これは、発注側にとっての支払額を低く抑えるという視点以上に、計算の単純化と不整合の回避を優先するためです。一方で、小売りや一般的なITサービスの課金システムでは、消費者の納得感を得るために「四捨五入」を採用するケースが目立つ。ここでの判断軸は、「支払う側にとって有利か、受け取る側にとって有利か」ではなく、「後から説明がつかない誤解を生まないか」という点にある。

社内でルールを策定する際には、以下のプロセスが不可欠です。

1. 業務ごとの特性をリスト化する
2. 過去の経緯や上司・クライアントとの合意事項をヒアリングする
3. 採用する関数を一つに絞り、それを文書化する

私が実際に行ったのは、Excelシートの隅に「計算ルール一覧」という別シートを作成することだった。どの列が何の関数を使っているのか、なぜその関数を選択したのかという「根拠」を明記した。例えば「交通費精算列:ROUNDDOWN(国税庁の指針に準拠し、切り捨てを採用)」といった具合です。これは、将来的に担当者が変わったときや、数年後に自分がこのシートを開いたときに、迷子にならないための道標でもある。

また、社内で「なんとなく」進んでいた業務を、ルール化するという作業は想像以上に骨が折れる。現場のベテラン社員からは「今までこのままで良かったじゃないか」という反発も予想される。しかし、私は実体験としての「350円のズレ」を提示し、それが将来的に大きな監査リスクや対外的な信頼失墜を招きかねないことを説いた。数字を合わせるということは、単なる作業の完了ではなく、業務の透明性を担保することなのです。そう言い切ることで、ようやく周囲の理解を得ることができた。

会社で策定された端数処理の統一ルール一覧(日本語)。

おまけ:PythonのROUNDは「銀行丸め」なので注意が必要

さて、独学でPythonを学び始めると、この「端数処理の深淵」にさらなる異次元の罠が待っていることに気づく。Excelでの経験から「ROUND関数を使えば大丈夫だろう」と安易にPythonのround()関数を使うと、とんでもない落とし穴にはまるのです。

Pythonの組み込み関数であるround()は、いわゆる「四捨五入」ではない。これは「銀行丸め(Banker’s Rounding)」あるいは「偶数丸め」と呼ばれる手法を採用している。具体的には、値がちょうど0.5である場合に、最も近い「偶数」に向かって丸めるという処理です。

例えば、Pythonで round(2.5) を実行すると 2 になる。一方で round(3.5) を実行すると 4 になる。なぜこのような奇妙な動きをするのかというと、統計的な誤差の偏りを防ぐためです。四捨五入のように常に「切り上げ」を行うと、データ量が増えるにつれて合計値が本来の数値よりもわずかに大きくなるバイアスがかかってしまう。銀行丸めは、偶数と奇数に丸め先を分散させることで、この誤差を打ち消し合い、より正確な平均値を算出するために開発された歴史的な経緯がある。

コンピュータの世界では、IEEE 754という浮動小数点数の標準規格が支配している。この規格では、コンピュータが計算を行う際に、どうしても0.1のような数値を完璧に表現できず、ごくわずかな誤差が発生する。この誤差が積み重なると、例えば0.1 + 0.2 が 0.30000000000000004 になるような現象が起きる。銀行丸めは、このようなコンピュータ特有の誤差の積み重なりに対して、より数学的にフェアな扱いをするために選ばれているのです。

しかし、実務のExcel運用者がこの挙動を知らずにPythonで集計ツールを組むと、Excel上の結果とPython側で計算した結果が一致せず、再び「数字が合わない」という地獄へ逆戻りすることになる。もしPythonでExcelのROUND関数と同じ「四捨五入」を実装したい場合は、標準ライブラリのdecimalモジュールを使用するのが定石です。

from decimal import Decimal, ROUND_HALF_UP

ExcelのROUND関数と同じ挙動を再現する方法

def excel_round(value, digits): # 値をDecimal型に変換し、四捨五入(ROUND_HALF_UP)を適用 quantizer = Decimal('1.' + '0' * digits) return Decimal(str(value)).quantize(quantizer, rounding=ROUND_HALF_UP)

使用例

print(excel_round(2.5, 0)) # 結果: 3

このように、コンピュータの世界における丸めルールを理解しておくことは、自動化を進める現代の事務職にとって必須の教養といえる。Excelだけ、あるいはPythonだけを見ていては気づけない数字の歪みを見つける力。それこそが、ベテラン事務職としての「数字に対する自信」の正体なのです。

完璧な自動化など、この世には存在しない。むしろ、完璧を目指して複雑な数式を組むことこそが、新たな誤差の温床になる。私がたどり着いた結論は、完璧な自動化よりも、どのセルにどのルールを適用したかという注釈を、一行、あるいはコメントとして残すことの尊さだった。誰が見ても計算の根拠が明確であり、かつ一貫性のある数式。そのシンプルさこそが、最強の武器になる。

かつて、上司から「数字が合わない」と指摘されたあの日の恐怖は、今では私の中に「信頼を守るためのセンサー」として生きている。あの時、ただ数字を合わせただけで終わらせず、その裏にある関数の動きを徹底的に調べ尽くした経験は、私を単なる「Excelオペレーター」から「数字の番人」へと成長させてくれたと自負している。これから自動化に取り組む全ての事務職諸君に伝えたい。あなたの書くその数式は、ただの命令ではない。あなたの仕事の信頼そのものなのです。だからこそ、端数処理という「一見地味な設定」にこそ、心血を注いでほしい。それが、プロフェッショナルとしての誇りを守るための、最小にして最大の防御策となるはずだからです。

このスキルを活かしてさらに前へ進むなら

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

ミニキットを見る(¥980)

[アンケート] この記事は役に立ちましたか?


1問だけ回答する