概要
Excel で計算していて「1 円だけ合わない」「0.3 と 0.1+0.2 が一致しない」――そんな“モヤッとする誤差”を丸ごと飲み込んでしまうのが、ここでいう 誤差吸収としての ROUND です。
これは入力ミスではなく、コンピュータ内部の「浮動小数点数」という仕組みによる仕様で、Excel も IEEE754 という規格に従って小数を近似的に扱っています。
だからこそ、「最後に ROUND で“見せたい桁”にそろえてしまう」という設計をしておくと、実務での“1 円ズレ”“0.0000000001 の差”をきれいに吸収できます。
なぜ誤差が出るのか(ざっくり理解)
浮動小数点数という“近似の世界”
Excel は、小数を「2 進数で近似して」保存・計算しています。
たとえば 0.1 は 10 進数ではきれいに書けますが、2 進数では「0.0001100110011…」のように無限に続く値になり、コンピュータはどこかで打ち切って近似します。
その結果、本来は 0.1+0.2=0.3 のはずが、内部的には 0.30000000000000004 のような“ほぼ 0.3 だけど完全ではない値”になることがあります。
見た目は 0.3 と表示されていても、内部の“ほんの少しのズレ”が、合計や比較の場面で顔を出すわけです。
表示と内部値のズレ
セルの表示形式で小数点以下を丸めて表示しているだけだと、「見た目は 100.00 なのに、内部では 99.9999999998 みたいな値」ということが起こります。
この状態で SUM や比較(=、IF)をすると、「見た目は同じなのに一致しない」「合計が 1 円ズレる」といった現象が出ます。
ROUND で誤差を“吸収”する考え方
キーワードは「正規化」
誤差吸収としての ROUND は、ざっくり言うと 「内部の値を、見せたい桁に合わせて正規化する」 という発想です。
たとえば「金額は 1 円単位で扱う」と決めたなら、
計算の最後で必ずこうします。
=ROUND(計算式,0)
これにより、内部に潜んでいた 0.0000000001 みたいな誤差を、“見せたい桁でバッサリ切る” ことができます。
合計前に丸めるか、合計後に丸めるか
誤差吸収の設計として、よく出てくるのが次の 2 パターンです。
- 各行の計算結果を ROUND してから SUM する
- SUM した結果を最後に ROUND する
どちらが正しいかは業務ルール次第ですが、
「請求書の明細ごとに端数処理する」のか、「合計だけ端数処理する」のかを決めて、
そのルールに合わせて ROUND を入れる位置を統一することが大事です。
コード例(誤差吸収の典型パターン)
パターン1:各行で誤差を吸収してから合計
たとえば、単価×数量×税率 で行ごとの税込金額を出し、それを合計するケースを考えます。
B 列:単価
C 列:数量
D 列:税率(例:1.1)
E 列:行ごとの税込金額
F1:合計
E2 にこう書きます。
=ROUND(B2*C2*D2,0)
これで「1 円未満を四捨五入した行金額」が E 列に並びます。
F1 では単純に
=SUM(E2:E100)
とすれば、合計も“誤差を吸収済みの値”だけを足すことになります。
パターン2:合計してから一括で誤差吸収
逆に、「行ごとの端数は気にせず、合計だけを丸めたい」場合は、
F1 に直接こう書きます。
=ROUND(SUM(B2:B100*C2:C100*D2:D100),0)
配列計算(または SUMPRODUCT)で合計を出し、その結果を 1 円単位で ROUND する形です。
この場合、「合計値の見た目」と「内部値」が一致するので、後続の計算や比較でズレが出にくくなります。
比較式での誤差吸収
A1 と B1 が“ほぼ同じ”ときの比較
浮動小数点誤差の典型的なトラブルが、次のような比較です。
=A1=B1
見た目はどちらも 0.3 なのに、内部的には 0.30000000000000004 と 0.3 で微妙に違い、FALSE になることがあります。
これを避けるには、比較前に ROUND で“同じ桁数にそろえる”のが定番です。
=ROUND(A1,10)=ROUND(B1,10)
「小数第 10 位まで四捨五入した値同士を比較する」という意味になり、
実務上無視してよいレベルの誤差を吸収できます。
設計としての「誤差吸収ルール」
どの桁で“世界を丸めるか”を決める
誤差吸収をうまくやるコツは、
「このブックでは、金額は 1 円単位、小数は小数第 4 位まで」
のように、“世界の解像度”を先に決めてしまうことです。
そして、
- 金額の最終結果セルは必ず
ROUND(…,0) - 割合の最終結果セルは必ず
ROUND(…,4) - 比較に使う値は必ず
ROUND(…,n)を通す
といった“設計ルール”を自分で決めて、数式に落とし込んでいきます。
これを徹底すると、「どこかで 1 円ズレる」「IF が思ったとおりに判定してくれない」といったトラブルが激減します。
例題
問題1
セル A2 に「0.1+0.2 の計算結果」、セル B2 に「0.3」が入っているとします。=A2=B2 が FALSE になる可能性がある理由を、浮動小数点数と誤差の観点から説明してください。
また、この 2 つを「実務上同じ」とみなして比較するための式を、ROUND を使って書いてください。
問題2
B 列に「単価」、C 列に「数量」、D 列に「税率(1.1)」が入っており、
E 列に「行ごとの税込金額」、F1 に「合計金額」を出したいとします。
「行ごとの金額は 1 円未満四捨五入し、その合計を出す」というルールで誤差吸収したいとき、
E2 と F1 にそれぞれどのような式を書けばよいか答えてください。
問題3
B 列と C 列に数値があり、=SUM(B2:B100) と =SUM(C2:C100) の結果が、
見た目は同じなのに 1 円だけズレているように見える状況があります。
このとき、「SUM の結果を 1 円単位にそろえて比較する」ための式を、ROUND を使って書いてください。
また、なぜそのような誤差が起こりうるのかを簡潔に説明してください。
問題4
あるブックでは、「金額は 1 円単位」「割合は小数第 3 位まで」というルールで端数処理と誤差吸収を統一したいとします。
金額の最終結果セルと、割合の最終結果セルに、それぞれどのような ROUND の形を採用すべきか、
具体的な数式例(ダミーの計算式で構いません)を挙げて説明してください。
問題5
次の 2 つの式は、どちらも「A2×B2」を計算していますが、誤差吸収という観点からどのような違いがあるか説明してください。
=A2*B2
=ROUND(A2*B2,2)
また、「どのような場面で後者のような書き方を“必須ルール”にした方がよいか」を、自分の経験やイメージに基づいて書いてみてください。
