月次の集計で、合計が1円ずれる。
検算しても数字は合っている。それなのに、シートの合計と手計算が違う。セルを一つずつ見ても、どこも間違っていない。
これは丸め方の話ではなくて、コンピュータが0.1という数を正確に持てないことから来ている。Excelの欠陥でもない。世界中のほとんどのソフトが同じ性質を持っている。
Microsoftはこれを公式に説明していて、その文書のなかで「Excelの制限ではない」とはっきり書いている。
この記事は育ちます。公開後も、会話パート・トーク・補足を足していきます。
公開 2026-10-02 / 最終更新 2026-10-02(公開)
水深 — まず、ずれを見てみる
空いたセルに、これを打ってみてほしい。
=(43.1-43.2)+1
0.9 と表示される。
そのセルの小数点以下の桁数を、15桁くらいまで増やしてみる。
0.899999999999999
0.9ではない。43.1から43.2を引いて1を足しただけなのに、答えがわずかに足りない。
もうひとつ。A1からA1000まで、小数第2位までの金額を1,000件並べて合計する。一件ずつ電卓で足した数字と、SUM関数の結果が、ときどき最後の1円で食い違う。
誤差は1件ごとには見えない。溜まってから表に出る。
0.1は、2進数では循環小数になる
原因は、数の書き方にある。
わたしたちは10進数を使う。10は2×5なので、分母が2か5でできている分数は、有限の桁で書ける。1/2=0.5、1/4=0.25、1/5=0.2。どれもきれいに終わる。
コンピュータは2進数を使う。2進数で有限の桁になるのは、分母が2のべき乗の分数だけだ。1/2、1/4、1/8。それ以外は終わらない。
1/10 は、2進数では終わらない。
Microsoftの文書は、この点を具体的に書いている。
分数 1/10 は 0.1 として 10 進数値システムで表すことができます。ただし、バイナリ形式の同じ数値は、次の繰り返しバイナリ 10 進数になります。
0001100110011100110011(など)
そして、こう続く。
この数は、有限の(限られた)領域で表すことはできません。そのため、この数値は格納時に約 -2.8E-17 で切り捨てられます。
0.1を入れた時点で、それは0.1ではない。 0.1よりごくわずかに小さい別の数が入っている。
10進数で1/3が0.3333…と終わらないのと同じことが、2進数では1/10で起きる。

IEEE 754という国際規格
この振る舞いはExcelの独自仕様ではない。IEEE 754という規格に従っている。
Microsoftの文書は、そこもはっきり書いている。
Microsoft Excel は、IEEE 754 仕様を中心に設計され、浮動小数点数の格納方法と計算方法を決定しました。
754 標準は、(中略)今日の PC ベースのマイクロプロセッサのほぼすべての浮動小数点ユニットと数値データ プロセッサで使用されます。
つまり、CPUのレベルでそうなっている。ExcelがそこにJavaやPythonと同じ土俵で乗っているだけだ。
だから「Excelは計算が甘い」という言い方は正確でない。電卓以外のほぼ全部が同じ性質を持っている。
15桁を超えると、切り捨てられる
もうひとつ、同じ規格から来る制限がある。
Excel は 1.79769313486232E308 から 2.2250738585072E-308 までの数値を格納できますが、有効桁数は 15 桁以内に限られます。この制限は、IEEE 754 仕様に厳密に従った直接的な結果であり、Excel の制限ではありません。
扱える数の大きさは桁違いに広い。ただし意味のある桁は15桁までだ。16桁目から先は保持されない。
これは実務で、思わぬところに出る。
- クレジットカード番号は16桁。数値として入れると、末尾が0になる
- 長い管理番号や、支店コードと口座番号をつないだ数字も崩れる
- 崩れたことに気づきにくい。エラーにならず、静かに末尾が0になる
対策はひとつしかない。番号は数値でなく文字列で持つ。
セルの書式をあらかじめ「文字列」にしてから入力する。CSVから読むときは、データタブの「テキストまたはCSVから」で列の型を文字列に指定する。あとから書式を変えても、失われた桁は戻らない。
計算に使わない数字は、数字として持たない。 これは覚えておくと事故が減る。
Excelは、途中で少し直している
面白いのは、Excelがこの問題を放置していないことだ。
Excel 97 では、この問題の修正を試みる最適化が導入されました。加算演算または減算演算の結果、値が 0 または非常に近い場合、Excel 97 以降は、オペランドをバイナリとの間で変換した結果として発生したエラーを補正します。
結果がゼロに近いときだけ、こっそり補正している。
だから =0.1+0.2-0.3 のような式は、素直に0になる。手元で試して「ずれないじゃないか」と思うのは、この補正が効いているからだ。
一方、さきほどの =(43.1-43.2)+1 は、結果が0.9でゼロから遠い。補正の対象にならないので、誤差がそのまま出る。
直っているところと、直っていないところがある。 それが、この問題を分かりにくくしている。
表示されている数字と、中身は違う
もうひとつ押さえておきたいのが、表示と実体の分離だ。
セルの表示形式を「小数点以下2桁」にすると、画面には 0.90 と出る。けれど中身は0.8999…のままだ。表示形式は見た目を変えるだけで、値を変えない。
これが何を意味するか。
- 画面上は 100.00 と 100.00 でも、中身が違うことがある
- その2つを = で比べると FALSE になる
- VLOOKUPやXLOOKUPの完全一致検索も、同じ理由で外れる
「見えている数字は同じなのに一致しない」という現象の、かなりの割合がこれだ。

経理でいちばん効くのは、消費税
実務で誤差がいちばん表に出るのは、消費税まわりだと思う。
税抜金額に0.1を掛ける。1件ごとに小数が出る。それを1,000件合計する。合計に0.1を掛けた額と、1円合わない。
ここで大事なのは、浮動小数点の誤差と、端数処理のルールは別の問題だということだ。
- 浮動小数点の誤差 1円未満のさらに下、小数点以下15桁あたりの話
- 端数処理 1円未満をどう扱うか(切上げ・切捨て・四捨五入)の話
合計が1円ずれたとき、たいていは端数処理のほうが原因だ。ただ、両方が同時に起きると原因の切り分けができなくなる。だから浮動小数点の誤差は、先に潰しておくのがいい。
ROUNDを、どこに入れるか
対策は単純だ。丸めたい段階でROUNDを入れる。
問題は「どこに入れるか」で、ここで結果が変わる。
① 明細ごとに丸める
=ROUND(B2*0.1,0) を各行に入れて、それを合計する。
② 合計してから丸める
=ROUND(SUM(B2:B1000)*0.1,0) とする。
①と②は、一致しない。1件あたり最大1円未満の差が、件数ぶん積み上がるからだ。
どちらが正しいかは、Excelではなく取引のルールが決める。請求書の消費税をどう計算するかは、インボイス制度で「一の適格請求書につき、税率ごとに1回」と決まっている。そちらに合わせる。
つまり、ROUNDの位置は技術の問題ではなく、制度の問題になる。
ひとつだけ技術的に言えるのは、丸めは一度だけにすること。丸めた数をさらに丸めると、誤差が二重に乗る。
ROUNDDOWNとINTは、同じではない
丸めの関数は3つ覚えておけば足りる。
- ROUND(数値,桁) 四捨五入
- ROUNDDOWN(数値,桁) 切り捨て(ゼロに近づく方向)
- ROUNDUP(数値,桁) 切り上げ(ゼロから遠ざかる方向)
桁の指定が分かりにくいので、表にしておく。
| 桁 | 意味 | 例(1234.567) |
|---|---|---|
| 2 | 小数第2位まで残す | 1234.57 |
| 0 | 整数にする | 1235 |
| -1 | 十の位で丸める | 1230 |
| -3 | 千の位で丸める | 1000 |
マイナスの桁が使えることは、意外と知られていない。決算書を千円単位にするときに効く。
もうひとつ、INT関数はROUNDDOWNと違う。
- ROUNDDOWN(-1.5, 0) → -1(ゼロに近づく)
- INT(-1.5) → -2(小さいほうへ)
マイナスの値が出る場面——値引き、返品、為替差損——でここを取り違えると、1円ずれる。金額の丸めにINTを使わない、と決めておくのが安全だ。
MROUNDと、50銭の話
もう少し古い実務の話もしておく。
かつて日本には50銭単位の端数処理を求める場面があった。いまでも、外貨建ての換算や、単価に銭の単位が残る業界では出てくる。
MROUND(数値, 倍数) を使うと、指定した倍数の最も近い値に丸められる。
- MROUND(123.4, 0.5) → 123.5
- MROUND(1234, 100) → 1200
CEILING関数、FLOOR関数も同じ系統で、こちらは上か下かの方向を指定できる。
- CEILING(1234, 100) → 1300
- FLOOR(1234, 100) → 1200
送料の重量区分、駐車料金の時間区分、階段式の手数料。「いくらごとに切り上げ」という計算は、これで一行になる。IF文を重ねる必要はない。

数字を比べるときは、イコールを使わない
誤差があるという前提で作るなら、比較の書き方も変える。
避けたい書き方
=IF(A1=B1,”一致”,”不一致”)
安全な書き方
=IF(ROUND(A1,2)=ROUND(B1,2),”一致”,”不一致”)
=IF(ABS(A1-B1)<0.005,”一致”,”不一致”)
前者は「小数第2位まで見て同じなら一致」、後者は「差が0.005未満なら一致」という意味になる。
突合せや消込のシートでは、後者の書き方をしておくと、原因不明の不一致がぐっと減る。
一致しないもうひとつの原因 — 文字列と全角
数字が一致しない原因は、浮動小数点だけではない。実務では、むしろこちらのほうが多い。
① 片方が文字列になっている
「1000」(文字列)と 1000(数値)は、Excelでは別物だ。見た目はほぼ同じで、左寄せか右寄せかでしか分からない。
② 全角の数字が混ざっている
「1000」は文字列であり、数値の1000とは一致しない。基幹システムから出したCSVに全角が混ざることがある。ASC関数で半角に直せる。
③ 見えない空白が入っている
前後にスペースや改行が入っていると一致しない。TRIM関数で前後の空白を、CLEAN関数で印刷できない文字を落とせる。
④ ハイフンの種類が違う
「-」(半角ハイフン)と「−」(全角マイナス)と「‐」(別のハイフン)は、全部違う文字だ。取引先コードの突合せでよく詰まる。
一致しないときの確認順は、桁数(LEN)→ 型(ISNUMBER)→ 誤差(ROUND) が早いと思う。LENで長さが違えば空白か全角、ISNUMBERがFALSEなら文字列、どちらも問題なければ浮動小数点を疑う。
「表示桁数で計算する」は、最後の手段
Excelには、この問題に正面から効くオプションがある。
ファイル → オプション → 詳細設定 → 「このブックの計算時」→ 「表示される精度を設定する」。
これを入れると、各セルの値が、表示されている値そのものに書き換わる。0.8999…は0.9になる。誤差は消える。
ただし、注意が3つある。
- 不可逆。チェックを外しても、失われた桁は戻らない
- ブック全体にかかる。一部のシートだけ、はできない
- 表示形式を変えると値が変わる。桁数を減らして保存すると、その桁で確定してしまう
集計専用の最終ブックでは有効だが、元データを持っているブックで入れてはいけない。
そして、このオプションが入っているブックを他人から受け取ったとき、気づく手段がほとんどない。オプション画面を開くまで分からない。原因不明の数値のずれに出会ったら、一度見ておく価値がある。
通貨は、整数で持つという考え方
システム開発の世界では、金額を小数で持たないのが定石になっている。
円なら整数。ドルやユーロならセント単位の整数。
こうすると、そもそも小数が出てこないので、浮動小数点の誤差が入りようがない。会計システムの内部が整数で作られているのは、たいていこの理由だ。
Excelでも同じ考え方は使える。単価に小数が出るなら、小数第2位までを100倍して整数で持ち、表示のときだけ100で割る。手間はかかるが、突合せがシビアなシートでは効く。
ここまでやる必要があるのは、金額の桁が大きく、件数が万単位になる場合だ。日常の集計であればROUNDで足りる。
他のソフトでも同じことが起きる
最後に、念のため。
この性質はExcelに限らない。IEEE 754に従っている以上、他の表計算ソフトも、多くのプログラミング言語も同じ結果を出す。
「Excelだから信用できない」のではなく、2進数で計算する以上そうなる、というだけの話だ。
逆に、電卓の多くは10進数で計算している。だから電卓とExcelで答えが違うことがある。どちらかが壊れているのではなく、数の持ち方が違う。
ちなみに、会計や金融の分野で使われるプログラミング言語には、10進数をそのまま扱う専用の型が用意されていることが多い。誤差を避けたい世界は、2進数をやめるという解き方をしている。
シートを作るときの、5つのルール
実務に落とすと、こうなる。
- 番号は文字列で持つ。計算に使わない数字を数値にしない
- 丸めは一度だけ。位置は制度が決める
- 比較は = を使わず、ROUNDかABSで許容差を持たせる
- 金額の丸めにINTを使わない。ROUNDDOWNを使う
- 「表示される精度を設定する」は、元データのブックでは入れない
この5つを守っておけば、原因不明の1円は、ほとんど出なくなる。
航路 — 見えない下の桁で起きていること
整理する。
- 2進数では1/10が循環小数になる。0.1を入れた時点で0.1ではない
- これはIEEE 754という規格の性質。Microsoftも「Excelの制限ではない」と明記している
- 有効桁数は15桁。16桁目から先は失われる。長い番号は文字列で持つ
- Excel 97以降、結果がゼロに近いときだけ補正している。だから直るときと直らないときがある
- 表示形式は値を変えない。見えている0.90の中身は0.8999…かもしれない
- 対策はROUNDを一度だけ、正しい位置に入れること。位置は制度が決める
- 比較には = を使わず、ROUNDかABSで許容差を持たせる
- 一致しない原因は、文字列・全角・空白のほうが多い。先にそちらを確認する
- 「表示される精度を設定する」は強力だが不可逆
調べていて印象に残ったのは、Microsoftの文書の姿勢だった。
1900年の閏年のときは「間違っているが直さない」と書いていた。今回は「これは我々の制限ではなく規格だ」と書いている。どちらも言い訳をしていないし、直すふりもしていない。
そして、こちらが知っておくべきことは結局ひとつだった。
画面に見えている数字と、セルの中にある数字は、別物かもしれない。
合計が1円合わないとき、まずそこを疑う。
この記事は、まだ書きかけです
この記事は、公開してから足していく形にしています。調べたことを書いた本文がまず先にあって、あとから「聞き手と話し手の会話」「あとで思い出したこと」「読んだ人から教わった補足」が積もっていきます。
だから、同じURLでも半年後には別のものになっているはずです。もし一度読んだことがある記事なら、下の更新ログだけ見てください。増えたところが分かります。
更新ログ
- 2026-10-02 公開(本文のみ。会話パートはこれから足します)

