Excelで集計しているのに、合計金額が毎月少しずつずれることがありました。最初は入力ミスだと思って、明細を何度も見直していました。
ところが原因は入力欄ではありませんでした。ROUND、ROUNDDOWN、TRUNCという端数処理の関数が、列ごとに混ざっていたことでした。
この記事では、Excelの端数処理で集計がずれる原因を、自分が実際にハマった流れで整理します。どこを確認し、どうやって統一ルールに直したかも残しました。
積み重なる端数処理のズレ
自動集計に切り替えた直後のことです。月次の交通費と経費を合算したところ、手元の電卓メモと合計が合いません。
最初は、どこかの金額を打ち間違えたのだと思いました。けれども明細を見直すと、入力値はほとんど合っています。
数式を一つずつ確認して、ようやく原因が見えました。交通費の列はROUNDでした。物品購入の列はROUNDDOWNで、補正の列はTRUNCでした。
どれも端数処理の関数なので、当時の私は同じようなものだと思っていました。でも、行数が増えると小さな違いが積み重なります。私の場合は、合計で数百円の差になっていました。

Excel丸め関数の比較
このズレの原因は、私が各関数の動きをきちんと理解していなかったことでした。Excelには端数処理の関数がいくつもあります。ただし、同じ目的で使えるとは限りません。まず、主要な3つの関数の動きを整理しました。
比較のために、「2.5」と「-2.5」を整数に丸めるケースで見ました。
まずROUND関数は、一般的な四捨五入の関数です。ROUND(2.5, 0)の結果は3になります。この結果は直感的に分かりやすいです。一方で、ROUNDDOWN関数は値を切り捨てます。ROUNDDOWN(2.5, 0)は2です。TRUNC関数は、指定した桁より下を削ります。同じ条件では、TRUNC(2.5, 0)も2です。正の数だけなら、ROUNDDOWNとTRUNCは近く見えました。でも、負の数になると結果が変わります。
ここで一度立ち止まって考えてみてください
Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。
負の数処理、関数選びの落とし穴
試しにROUND(-2.5, 0)を見ると、結果は-3になります。四捨五入という概念に基づけば、絶対値側で処理されるためです。ここまでは予想通りでしょう。しかし、問題はここからです。ROUNDDOWN(-2.5, 0)を実行すると、結果は-3になります。0に近い方へ寄るとは限りません。より小さい方向へ動くことがあるからです。これに対し、TRUNC(-2.5, 0)を実行すると、結果は-2になります。TRUNCは、小数点以下を単に消すような動きです。そのため、負の数では絶対値が小さくなることがあります。
この挙動の違いが、経費精算における「予算差異分析」などで致命的なズレを発生させる。返金や補正では、マイナスの値を扱います。このとき、関数の違いで合計が数円単位で変わります。私は、この関数ごとの特性を理解しないまま、その場の思いつきで使い分けていたのです。これが「関数だから正しい」という過信につながりました。結果として、業務の信頼を落としました。

微細な端数処理が累積する計算誤差
なぜこれほどまでに誤差が積み上がったのか。ここでは、Excelのセルが積み上がることを考える必要があります。単純な算数だけでは見落としがちでした。
200行にわたる交通費精算のリストを想像してほしい。各行で小数点以下が出るとします。その処理ルールがバラバラなら、合計もずれました。ある行では0.4円が切り捨てです。別の行では四捨五入で1円になります。この「0.6円」という差分が、100行分続けばどうなるか。理論上、最大で60円近い誤差が、何の説明もつかないまま合計金額に紛れ込むことになります。
不整合を招く端数処理の曖昧さ
これが何百行、あるいは部署を跨いだ統合シートになると、誤差はさらに増えます。私が直面した350円のズレは、端数処理の不一致が原因でした。200行分で大きく見えたのです。手計算の時代は、人がその場で判断していました。「今回は切り捨てでいこう」と頭の中でそろえていたのです。しかし、自動集計では数式が厳格に働きます。人間が曖昧にしていた部分も、Excelは式どおりに計算します。その結果、不整合が見える形で出ました。
ここで重要なのは、どちらの計算が「正しいか」という議論ではありません。会計の世界では「どちらのルールを採用するか」を合意し、それを一貫して適用することこそが大事です。列ごとに、あるいは担当者ごとに勝手な関数を使うことは、計算の根拠そのものを壊す行為に他ならありません。この事実を見たとき、数式だけ直しても足りないと思いました。端数処理ルールそのものを決める必要がありました。
端数処理の統一ルール、信頼性向上
まずは、シートの数式を見える状態にします。Excelの「数式の表示」モード(Ctrl+Shift+@)を使い、すべてのセルを一気に眺める。そこには、ROUND、ROUNDDOWN、TRUNCが混ざり合っている様子が見えました。整理されていない数式が並んでいて、かなり焦ります。私は一つずつ、すべての列の性質を確認します。交通費は切り捨てなのか、それとも四捨五入なのか。消費税の計算ルールはどうなっているのか。一つ一つのセルを再定義する作業は、まさに汚れた庭を掃除するような泥臭い作業でした。しかし、このプロセスを経ることなしに、信頼を取り戻すことはできません。

端数処理を統一するとき、最初に迷う点があります。切り捨てにするか、四捨五入にするかです。これは単なる好みの問題ではありません。業種や取引の内容によって、どちらが「一般的」かが決まってくることが多いからです。
計算ルール策定と業務透明化
例えば、契約によっては金額の端数を切り捨てることがあります。これは支払額を抑えるためだけではありません。計算を単純にし、不整合を避けるためでもあります。一方で、小売りやITサービスでは四捨五入も見かけました。利用者にとって分かりやすいからだと感じました。ここでの判断軸は、有利不利だけではありません。後から説明できるかどうかが大事です。
社内でルールを策定する際には、以下のプロセスが必要です。
1. 業務ごとの特性をリスト化する2. 過去の経緯や上司・クライアントとの合意事項をヒアリングする3. 採用する関数を一つに絞り、それを文書化する
私が実際に行ったのは、Excelシートの隅に「計算ルール一覧」という別シートを作成することでした。どの列が何の関数を使っているのか、なぜその関数を選択したのかという「根拠」を明記した。例えば「交通費精算列:ROUNDDOWN」と書きました。理由も横に添えました。これは、担当者が変わったときにも役立ちます。数年後の自分が見ても迷いにくくなります。
350円のズレで得た理解
また、社内で「なんとなく」進んでいた業務をルール化する作業は、想像以上に大変でした。現場のベテラン社員からは、反発もありそうでした。そこで、私は実際に出た350円のズレを見せました。小さな差でも、説明できなければ信頼を落とすと伝えました。数字を合わせるということは、単なる作業の完了ではなく、業務の透明性を担保することなのです。そう話すことで、ようやく周囲の理解を得られました。

Python round()の落とし穴:四捨五入と異な…
その後、独学でPythonを学び始めました。そこで、端数処理には別の小さな罠もあると気づきます。Excelの経験だけで、Pythonのround()を使うとハマりました。同じ名前に見えても、動きが違う場面があります。
Pythonの組み込み関数であるround()は、いわゆる「四捨五入」ではありません。これは銀行丸めと呼ばれる方法です。偶数丸めと呼ばれることもあります。具体的には、値がちょうど0.5である場合に、最も近い「偶数」に向かって丸めるという処理です。
例えば、Pythonで round(2.5) を実行すると2になります。一方で、round(3.5) は4になります。なぜこのような奇妙な動きをするのかというと、統計的な誤差の偏りを防ぐためです。常に切り上げると、データ量が増えるほど合計が少し大きくなります。これが偏りでしたね。銀行丸めでは、丸め先を偶数と奇数に分散させます。誤差の偏りを小さくするための考え方です。
浮動小数点数の誤差とPythonでの丸め
コンピュータの世界では、IEEE 754という浮動小数点数の標準規格があります。この規格では、0.1のような数値を完全には表せないことがあります。そのため、ごく小さな誤差が出るのだと感じました。この誤差が積み重なることもあります。例えば0.1 + 0.2の結果が、見慣れない小数になることもあります。銀行丸めは、こうした誤差の偏りを減らすための考え方です。数学的にはフェアな扱いです。
ただ、この挙動を知らないままPythonで集計すると危ないと感じました。Excelの結果とPythonの結果が合わず、また「数字が合わない」に戻ります。PythonでExcelのROUNDに近い処理をしたい場面もあります。そのときはdecimalモジュールを使うと説明しやすいです。
自動化に必須!PythonでのExcel丸め
from decimal import Decimal, ROUND_HALF_UP
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業務を自動化する前に確認するチェックリスト(PDF)
自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。
¥980 ミニキット
コピペで動かせる3スクリプト+自動化チェックリスト
最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。
■ 著者はこうして解決の糸口を見つけた
著者も端数処理のミスで叱られた経験があります。その時の葛藤と克服への第一歩もあわせてどうぞ。
このスキルを活かしてさらに前へ進むなら
PythonやVBAを体系的に学びたい方には「SAMURAI ENGINEER」のマンツーマン指導が効果的です。自分の業務で使うコードを講師と一緒に作りながら学べるため、「独学で挫折した」という方でも確実にスキルを習得できます。
関連書籍
Excel・VBA関連書籍を、手元で見返せる形にしておきたい場合
ExcelやVBAのトラブルは、基本の考え方をあとから見返せるだけでかなり楽になります。手元に1冊置いておくと、同じエラーで止まったときに確認しやすいです。
完全版のご案内
Excelの端数処理ズレを撲滅するテンプレ+監査コード
端数処理のルールをチームで統一するときに使っている列別ルール台帳のテンプレートと、ROUND混在を自動検出するPythonコードをnoteにまとめています。この記事の内容を実務へ落とし込む段階で役立つと思いますので、必要な方はこちらをどうぞ。
[アンケート] この記事は役に立ちましたか?

