金曜日の夕方、経費の按分計算を終えて、念のため2つの合計が一致するか確かめたときのことです。
画面には、どちらのセルにも「1,250.00」と表示されていました。同じ数字です。どこからどう見ても同じ数字です。それなのに、空いたセルに =A1=B1 と入れてEnterを押した瞬間、返ってきたのは FALSE でした。
最初は自分が入力ミスをしたのだと思って、両方のセルをクリックして数式バーを見比べました。やっぱり同じです。電卓を叩いても同じ。それでもExcelは「この2つは違う値です」と言い張る。あのときの、足元が急に抜けたような感覚は、今でもはっきり覚えています。
結論から言うと、原因は割り算の過程で生まれた、小数点以下15桁目あたりのごくわずかなズレでした。人間の目にはまったく見えない位置の話です。でもExcelにとっては、それは立派な「別の値」なのです。
この記事では、その見えないズレを自分の目で確認する方法から、なぜ起きるのか、どこにROUND関数を入れれば止まるのか、そして表示形式で隠してはいけない理由まで、実際に手を動かしながら順番に確かめていきます。難しい理論は最小限にして、明日そのまま使える形でまとめました。
まずは「ズレを見える化」する実験から
原因の説明を読むより、自分のExcelで一度見てしまったほうが早いです。手元にExcelがあれば、空いているシートで一緒にやってみてください。30秒で終わります。
実験1:引き算してみる
一致しないと感じている2つのセル(仮にA1とB1とします)について、空いたセルにこう入力します。
=A1-B1
同じ値どうしなら、答えは当然「0」になるはずです。ところが、ここで 0 ではなく 5.55112E-17 のような見慣れない表記が出てきたら、それが犯人です。
5.55112E-17 は指数表記で、「0.0000000000000000555112」という意味です。小数点以下17桁目。普段の仕事では絶対に意識しない世界ですが、Excelはこの差をきっちり見ています。
実験2:表示桁数を増やしてのぞき込む
もう少し直接的に、セルの中身を見る方法もあります。
該当のセルを選んだ状態で、[ホーム]タブの「数値」グループにある 「小数点以下の表示桁数を増やす」ボタン(.00 に右向き矢印がついたアイコン)を、10回ほど連打してみてください。
表示上は「10」だったセルが、「10.0000000000000」とゼロが並ぶだけなら問題なし。ところが「9.9999999999999」のように、9が延々と続く表示に変わることがあります。これが、見た目に隠れていた本当の中身です。
関数で確認したい場合は、こちらでも同じことができます。
=TEXT(A1,"0.####################")
セルの表示形式に左右されず、内部の値を文字として書き出してくれるので、比較用の作業列に入れておくと便利です。
実験3:Excelが壊れているわけではないと確認する
最後に、どのパソコンのExcelでも同じ結果になる、有名な例を試します。空いたセルに、順番にこう入れてみてください。
| 入力する式 | 返ってくる結果 |
|---|---|
| =0.1+0.2 | 0.3 |
| =(0.1+0.2)-0.3 | 5.55E-17 |
| =IF(0.1+0.2=0.3,”一致”,”不一致”) | 不一致 |
1行目は「0.3」と表示されるのに、2行目で0.3を引くとゼロになりません。3行目に至っては、0.1+0.2と0.3が「不一致」と判定されます。
これは故障でも、ファイルの破損でもありません。世界中のExcelで、まったく同じ結果になります。つまり、あなたのファイルだけの問題ではない、ということです。ここが分かるだけでも、だいぶ気持ちが落ち着くはずです。
なぜ、こんなことが起きるのか
理屈を知らなくても直せますが、知っておくと「どこにROUNDを入れるべきか」の判断がぐっと楽になります。少しだけお付き合いください。
10進数でも同じことが起きている
紙に「1÷3」の答えを書いてください、と言われたらどうしますか。
0.3333…と書き始めて、どこかで諦めて止めますよね。0.333で止めれば、3倍しても0.999にしかなりません。1には戻らない。これは計算を間違えたからではなく、10進数では1/3を有限の桁数で書き切れないからです。
コンピューターの中で起きているのは、まったく同じことです。
コンピューターは2進数で小数を持っている
Excelは、数値を内部的に2進数(0と1の並び)で保存しています。そして2進数の世界では、0.1 や 0.2 や 0.3 が、ちょうど1/3のように「書き切れない小数」になってしまうのです。
そのため、Excelが保持している0.1は、厳密には0.1ではなく「0.1にものすごく近い、ちょっとだけ違う数」になります。この方式は浮動小数点と呼ばれ、Excelに限らず、ほぼすべての表計算ソフトやプログラミング言語が採用しています。
そこから生まれる微小なズレが、浮動小数点誤差です。
Excelは誤差を「隠して」表示している
ここが初心者の方がいちばん混乱するポイントだと思います。
Excelは、セルに数値を表示するとき、有効桁数15桁までに整えて見せる仕様になっています。誤差が出るのは15桁目より奥なので、普段は画面に出てきません。Excelなりの気遣いとも言えます。
ところが、=A1=B1 のような比較や、VLOOKUPの完全一致検索は、表示されている値ではなく、内部に保存されている値そのものを見ます。隠されていたズレが、このときだけ表に飛び出してくる。だから「見た目は同じなのに一致しない」という、あの不可解な現象が起きるわけです。
Excelの世界では、表示=実際の値ではない。これを頭の片隅に置いておくと、この先のトラブル対応がかなり楽になります。
誤差が表に出てくる4つの瞬間
誤差はいつでも顔を出すわけではありません。私がこれまで現場で遭遇したのは、だいたい次の4つの場面でした。自分の状況がどれに当てはまるか、探してみてください。
ケースA:イコールで比較したときに「不一致」になる
=IF(A1=B1,"一致","不一致") や =A1=B1 で、目で見て同じ数字なのに一致しない。いちばん典型的なパターンです。逆に言えば、この式は小数点の誤差を見つけるための最短の検査器具でもあります。
ケースB:VLOOKUPやXLOOKUPが「#N/A」を返す
検索値が数値で、しかも割り算や掛け算を経由して作られた値だった場合は要注意です。検索値の内部が「1.0000000000001」で、表の側が「1」なら、完全一致(FALSE指定)では当然見つかりません。
ただし、VLOOKUPの#N/Aは原因が1つではありません。スペースの混入や、検索範囲の指定ミス、TRUE/FALSEの設定違いなど、もっと頻度の高い原因もあります。小数点を疑う前に、まずは代表的な原因から順に潰していくほうが早く解決します。
#N/Aの切り分け手順は、VLOOKUPで#N/Aが消えないときの原因と対処法でくわしくまとめています。実務で多い3つのミスから順に確認できるので、先にこちらを一周してから小数点を疑うのがおすすめです。

ケースC:SUMの合計が数円だけ合わない
1件あたり0.004円のズレでも、3,000件積み上がれば12円の差になります。請求書や経費精算では、この「数円」が差し戻しの理由になってしまうこともあります。
さらにやっかいなのが、明細を四捨五入した表示で見せておいて、合計だけは丸める前の値で計算しているパターンです。画面上の明細を電卓で足すと10,000円なのに、Excelの合計欄は9,999円。これは誤差というより、後で説明する「丸める場所」の問題です。
ケースD:条件判定やグラフの分類が想定とずれる
「0.5以上を対象にする」といった境界値の判定は、誤差にとても弱い場面です。内部が0.49999999999になっていれば、>=0.5 の条件からするりと外れます。ピボットテーブルで同じ値が2行に分かれてしまう、条件付き書式が一部のセルだけ反応しない、といった現象も、内部の値が微妙に違うことが原因のことがあります。
本命の対処:ROUND関数は「どこに入れるか」で効き方が変わる
小数点のズレを止める方法は、基本的にひとつです。ROUND関数で、値そのものを丸めて揃える。
=ROUND(A2, 2)
第2引数が「どの位で丸めるか」の指定です。2 なら小数第2位まで、0 なら整数、1 なら小数第1位まで。表示を変えるのではなく、値そのものを作り直すのがROUNDの役割です。
ただ、実務で差が出るのは、ROUNDを「知っているか」ではなく「どこに入れるか」のほうです。同じ関数でも、置く場所によって結果がまったく変わります。
入れる場所は、大きく3パターンある
| パターン | 書き方の例 | 向いている場面 | 注意点 |
|---|---|---|---|
| ① 取り込んだ直後に丸める | 作業列に =ROUND(A2,2) | CSVや他システムから受け取った数値 | 元データは残したまま、作業列で丸める |
| ② 割り算・掛け算の直後に丸める | =ROUND(B2/C2,2) | 按分・単価計算・消費税・比率 | 誤差が生まれた瞬間に止められる。実務ではこれが本命 |
| ③ 最後の合計だけ丸める | =ROUND(SUM(D2:D100),0) | ざっくりした概算 | 明細と合計が合わなくなりやすい |
いちばん効くのは②です。浮動小数点誤差は割り算で生まれることが多いので、生まれた直後に丸めてしまえば、その先の集計や比較に持ち越されません。「誤差は発生源で止める」と覚えておくといいと思います。
逆に、③だけで済ませようとすると、先ほどのケースCのような「明細と合計が1円違う」問題が起きます。画面に見せる明細が丸めた値なら、合計も丸めた値を足さなければ、当然ながら数字は合いません。
四捨五入以外の選択肢も知っておく
「とりあえずROUND」で済ませてしまいがちですが、業務によっては丸め方のルールが決まっていることがあります。代表的なものを並べておきます。
| 関数 | 動き | よく使う場面 |
|---|---|---|
| ROUND(値,桁) | 四捨五入 | 一般的な金額・比率 |
| ROUNDDOWN(値,桁) | 切り捨て | 消費税、ポイント付与 |
| ROUNDUP(値,桁) | 切り上げ | 必要数量、箱数の算出 |
| INT(値) | 小数を切り捨てて整数に | 日数・個数などの整数化 |
| MROUND(値,基準) | 指定した単位で丸める | 15分単位の勤務時間など |
| CEILING.MATH(値,基準) | 指定した単位で切り上げ | 100円単位の切り上げ請求 |
消費税は切り捨て指定の会社が多い、勤務時間は15分単位で切り上げ、といったローカルルールは、現場ごとに本当にバラバラです。計算式を作る前に、そのルールを一度確認しておくと、後から全部作り直す羽目になりません。
表示形式で「隠す」のがなぜダメなのか
小数点のトラブルに出会ったとき、多くの方が最初にやるのが「小数点以下を表示しない」設定です。[セルの書式設定]で小数第2位までの表示にすれば、画面上はきれいに揃います。
でも、これは解決ではありません。部屋の散らかったものを、押し入れに突っ込んで扉を閉めただけの状態です。
| セルの表示形式で桁を減らす | ROUND関数で丸める | |
|---|---|---|
| 画面の見た目 | 整う | 整う |
| セルの中の値 | 元のまま(誤差も残る) | 丸めた値に置き換わる |
| =A1=B1 の結果 | 一致しないまま | 一致する |
| SUMの合計 | 誤差が積み上がる | 積み上がらない |
| VLOOKUPの完全一致 | #N/Aのまま | 見つかる |
| CSVに書き出したとき | 元の誤差付きで出力される | 丸めた値が出力される |
表示形式は「見た目を変える機能」、ROUND関数は「中身を変える機能」。この線引きさえ押さえておけば、どちらを使うべきかで迷うことはなくなります。
計算や照合に使う値はROUNDで丸める。表示形式は、あくまで見やすさのため。 これが基本の考え方です。
【注意】「表示桁数で計算する」設定は安易に触らない
ここで、知っておいてほしい機能をひとつ紹介します。
Excelには[ファイル]→[オプション]→[詳細設定]の中に、**「表示桁数で計算する」**というチェックボックスがあります。これをオンにすると、Excelは画面に表示されている桁数の値をそのまま計算に使うようになります。つまり、誤差の問題が一発で消えたように見えます。
便利そうに聞こえますが、私は基本的におすすめしません。理由は3つあります。
ひとつ目は、設定がブック全体に効いてしまうこと。ある1つの表を直したかっただけなのに、同じファイル内の別のシートの計算まで、表示桁に丸められます。
ふたつ目は、元に戻せないこと。チェックを外しても、いったん丸められた値は元の精度には戻りません。Excel側も、この設定をオンにするときには警告を出します。
みっつ目は、他の人が開いたときに理由が分からないこと。数式を見ても丸めた形跡がないのに値が丸まっているので、引き継いだ人が必ず混乱します。
どうしても試したい場合は、必ずファイルをコピーしてから実験してください。実務で使うファイルでは、面倒でもROUND関数で明示的に丸めるほうが、後々の自分と後任者のためになります。
ROUNDを入れられないときの、もうひとつの手
元データに手を加えられない、数式を増やしたくない、といった事情があることもあります。その場合は、比較のしかたを変えるという逃げ道があります。
① 誤差を許容して比較する
=IF(ABS(A1-B1)<0.000001,"一致","不一致")
ABS関数は絶対値(マイナスを取り払った値)を返します。「差が0.000001より小さければ、実質同じとみなす」という考え方です。金額の照合であれば、<0.005(半銭未満)くらいでも十分実用になります。
② 比較する瞬間だけ丸める
=IF(ROUND(A1,2)=ROUND(B1,2),"一致","不一致")
元のセルには触れず、判定式の中だけで丸めます。手軽で、既存の表を壊さないのが利点です。
③ 検索値だけ丸める場合の落とし穴
VLOOKUPの検索値を丸めることもできます。
=VLOOKUP(ROUND(A2,2), 範囲, 2, FALSE)
ただし、この書き方で効果があるのは、検索される側(範囲の1列目)にも誤差がない場合だけです。表の側に誤差が残っていれば、丸めた検索値との突合は相変わらず失敗します。この場合は、表の側にも丸めた作業列を作るのが確実です。
誤差を溜めない3つの習慣
起きてから直すより、起きない状態を作っておくほうが、結局は早く終わります。私が定着させている習慣は3つです。
1つ目は、割り算の直後に必ず丸めること。 按分、単価計算、構成比。割り算が出てきたら、その式をROUNDで包む。これを条件反射にしておくだけで、トラブルの大半は起きなくなります。
2つ目は、列ごとに「この列は小数第2位まで」と決めてしまうこと。 同じ列の中で桁数がバラバラだと、誤差以前に集計が狂います。数値の形式がそろっていないことで起きる集計トラブルは、小数点の問題と根っこが同じです。
文字列の数字や全角数字が混ざっているケースについては、数値の形式がそろっていないときの見分け方と直し方にまとめてあります。ステータスバーやジャンプ機能を使った特定方法も紹介しているので、「合計が明らかにおかしい」段階の方はこちらが先です。

3つ目は、外部から取り込んだ直後に中身を確認すること。 CSVや基幹システムからの出力は、誤差だけでなく、数字が文字列として入ってくることもよくあります。取り込んだ瞬間に一度点検する癖をつけておくと、後工程が驚くほど静かになります。
CSV取り込みのトラブルは、CSVを開いたら合計が0だったときの点検手順で、COUNTとCOUNTAを使った30秒の切り分けから解説しています。外部データを扱う機会が多い方は、目を通しておいて損はありません。

よくある質問
Q1. ROUNDを入れたら、今度は明細の合計が1円合わなくなりました。
丸めた明細を足しているのに、合計欄だけ丸める前の値で計算している、という状態になっていないか確認してください。表に見せる値と、合計する値は、同じ丸め方で揃えるのが原則です。按分などで端数がどうしても合わない場合は、最終行で差額を調整する「端数調整行」を設ける方法が実務ではよく使われます。
Q2. ROUNDとROUNDDOWN、どちらを使えばいいですか。
社内ルールや取引先との取り決めが優先です。決まりがない場合、消費税や手数料の計算では切り捨て(ROUNDDOWN)を指定されることが多く、一般的な金額の丸めでは四捨五入(ROUND)が使われます。迷ったら、過去の請求書の数字から逆算して、どちらの方式で計算されているか確認するのが確実です。
Q3. 数式バーを見ても「0.3」としか表示されません。本当に誤差があるのですか。
数式バーの表示も、有効桁数15桁に整えられた結果です。誤差はその奥にあるため、数式バーでは確認できません。=A1-B1 や =TEXT(A1,"0.####################") を使うと、隠れている部分まで見えます。
Q4. すべての数式にROUNDを入れるべきでしょうか。
いいえ。入れる場所は「入口」と「割り算の直後」で十分なことがほとんどです。どこもかしこもROUNDで包むと、式が読みにくくなり、かえってミスを招きます。
Q5. 誤差は必ず起きるのですか。
整数どうしの足し算や引き算では、実用上ほぼ起きません。問題になるのは、割り算が絡むとき、小数を含む値を何度も計算に通すとき、外部システムから小数付きのデータを受け取るときです。逆に言えば、この3つの場面だけ警戒しておけば足ります。
Q6. ROUNDで丸めると、元のデータが消えてしまいませんか。
元のセルを直接書き換えるのではなく、隣に作業列を作ってROUNDの式を入れれば、元データはそのまま残ります。検算が必要な業務では、この作り方が安全です。
困ったときの3ステップ
今まさに数字が合わなくて焦っている方のために、最短の手順をまとめておきます。
=A1-B1で差を出す。 0以外の小さな値が出たら、浮動小数点誤差が原因です。- 表示桁数を増やして中身を見る。 どの位からズレているかを把握します。
- 誤差の発生源(たいてい割り算)をROUNDで包む。 発生源が特定できなければ、作業列で
=ROUND(元のセル,2)を作り、以降の計算はその列を参照します。
これで、比較も検索も集計も、揃った状態に戻せます。
研究員メモ
このシリーズを書きながら、いつも思うことがあります。
Excelは、不親切なのではなく、正直すぎるのだと思います。人間が「だいたい同じ」で済ませている部分を、Excelは一切妥協せずに区別する。だからFALSEを返すし、#N/Aを出す。
あの日、1,250.00と1,250.00がFALSEになったとき、私は「Excelがおかしい」と本気で疑いました。でも実際におかしかったのは、見た目だけを信じていた自分の確認方法のほうでした。
見た目ではなく、中身を確認する。この一手間を覚えてからは、原因不明のトラブルに振り回される時間が、目に見えて減りました。小数点の誤差は、その中身を意識するきっかけとしては、なかなか良い教材だと思っています。
まとめ
- 症状:見た目が同じなのに
=A1=B1がFALSE/VLOOKUPで#N/A/合計が数円ずれる/境界値の条件判定から外れる - 原因:コンピューターが小数を2進数で扱うために生じる浮動小数点誤差。Excelは15桁までしか表示しないため、普段は画面に出てこない
- 確認方法:
=A1-B1で差を出す。表示桁数を増やす。=TEXT(A1,"0.####################")で中身を書き出す - 解決方法:
=ROUND(値,桁数)で値そのものを丸める。とくに割り算の直後に入れるのが効果的 - やってはいけないこと:表示形式で小数桁を減らして「見えなくする」だけの対処。中身の誤差は残り続ける
- 丸め方の選択:四捨五入(ROUND)/切り捨て(ROUNDDOWN)/切り上げ(ROUNDUP)は、業務ルールに合わせて選ぶ
見た目と中身は違う。Excelを扱ううえで、これほど汎用性の高い教訓はないと思います。
なお、小数点の誤差を直したのに、それでも集計がうまくいかない場合は、表の構造そのものに原因があることもあります。見やすさのために入れた空白行が、集計や並び替えを静かに壊しているケースは、思った以上によくあります。
空白行が集計を壊しているときの見分け方と直し方では、そのチェック方法と直し方を解説しています。数値そのものは正しいのに合計がおかしい、という方は、そちらもあわせてご覧ください。

同じ列の中に数値と文字列が混ざっているケースについては、同じ列に数値と文字列が混ざっているときの直し方でも取り上げています。

もう一歩踏み込みたい方へ
この記事では、1つのセル・1つの計算式レベルでの対処を扱いました。ただ実務では、「按分の端数を最終行でどう調整するか」「明細と合計を必ず一致させる表の組み方」「複数シートをまたいだ金額照合で誤差をどう吸収するか」といった、もう一段複雑な場面が出てきます。
そうした複合的なケースと、そのまま貼り付けて使える数式テンプレートは、note会員限定コンテンツにまとめています。ブログ1本では扱いきれない応用パターンを知りたい方は、のぞいてみてください。


コメント