エクセルの差のチェックが、0なのにNG。小数の引き算は、ほんの少しずれることがあるんだよ

丸めてから、くらべる。ホワイトボードの表に30.3・30.3・差0・NGのハンコ。先輩が虫めがねで0のふちの小さな点を指し、後輩A君が「0なのにNG?」と驚いている絵 A君の成長

おはよう、後輩A君。

請求の額と入金の額をならべて、差が0ならOK、そうでなければNG。そんなチェックの表を、A君も作ったことはないかな。

先に答えを言うね。⭐ 請求と入金がぴったり同じなのに、チェックの式が NG を出したんだ。10行のうち4行で、なんだよ。差のセルは、どれも「0」と出ているのに、なんだ。

⇒ 直し方は、=IF(ROUND(C2-D2,2)=0,”OK”,”NG”) のように、差をROUND(四捨五入)してから0とくらべること。これで、10行ともOKになったよ。

11月7日に、Mac版のエクセル(16.113.2)で試したよ。表は命令(プログラム)で作って、答えを読むのも命令でしたんだ。請求や入金の数字、名前は、どれも試しに作ったものだよ。

1. 請求と入金の差をチェックしたら、10行のうち4行が NG だったんだよ

こんな表を作ったんだ。

A列 品目1
B列 品目2
C列 請求 → =A2+B2(品目1と品目2を足した数)
D列 入金 → 手で入れた数(請求と同じ数)
E列 差 → =C2-D2
F列 差=0? → =IF(C2-D2=0,”OK”,”NG”)

F列の式は、「請求から入金を引いて、0なら OK、ちがえば NG」という意味だよ。請求と入金は同じ数を入れたから、ぜんぶ OK になるはずだね。

結果は、こうだったんだ。
請求と入金のチェック表。E列の差はどの行も0なのに、F列の差=0?は2・3・5・6行目がNG、ほかはOK。数式バーには =IF(C2-D2=0,"OK","NG") と出ている

行 請求(品目1+品目2) 入金 差の見た目 チェック
2 10.1+20.2 → 30.3 30.3 0 ⚠️ NG
3 1.1+2.2 → 3.3 3.3 0 ⚠️ NG
4 100.7+200.2 → 300.9 300.9 0 OK
5 12.3+45.6 → 57.9 57.9 0 ⚠️ NG
6 0.7+0.1 → 0.8 0.8 0 ⚠️ NG
7 3.3+3.3 → 6.6 6.6 0 OK
8 1234.56+789.01 → 2023.57 2023.57 0 OK
9 50.5+25.25 → 75.75 75.75 0 OK
10 19.99+5.01 → 25 25 0 OK
11 8.8+1.1 → 9.9 9.9 0 OK

⭐ 2・3・5・6行目の4行で、差は「0」と出ているのに、チェックは NG だったんだ。

⚠️ もしこれが本当の仕事の表だったら、合っている入金を「合っていない」と思って、調べ直すことになるよね。

2. ⚠️ 差のセルは0なのに、かっこで包むと小さな数が出てきたんだよ

差のセル(E列)は、中身を読んでも 0 だったよ。表示を指数(E のつく書き方)に変えても 0.00E+00、つまり 0 のままだったんだ。

そこで、同じ引き算をかっこで包んで、=(C2-D2) と書いてみたんだ。あわせて、請求と入金を=C2=D2(同じなら TRUE)でもくらべたよ。
同じ表に、請求=入金の列とかっこ差の列を足したもの。請求=入金はどの行もTRUE。かっこ差は2行目が-3.6E-15、3行目が4.44E-16、5行目が7.11E-15、6行目が-1.1E-16で、ほかの行は0。数式バーには =(C2-D2) と出ている

2行目 =(C2-D2) → -3.6E-15 / =C2=D2 → TRUE
3行目 =(C2-D2) → 4.44E-16 / =C2=D2 → TRUE
5行目 =(C2-D2) → 7.11E-15 / =C2=D2 → TRUE
6行目 =(C2-D2) → -1.1E-16 / =C2=D2 → TRUE
ほかの6行 =(C2-D2) → 0 / =C2=D2 → TRUE

かっこで包むと小さな数が出たのは、IF で NG になった4行とまったく同じだったよ。

-3.6E-15 は、「-3.6 に、0.1 を15回かけた数」という意味だよ。小数で書くと、-0.0000000000000036。小数点の下に0が14個ならんだあとに、やっと 36 が来るくらい小さいずれなんだ(E-15 は小数点の下15けた目、という読み方から数えたよ)。

ずれる理由は、1つだけ覚えておけばいいよ。⇒ 小数は、エクセルの中で、ほんの少しずれて持たれることがあるんだ。そのずれが、IF の中の引き算には出てきた、ということなんだよね。

⭐ もう1つ。=C2=D2 は、10行とも TRUE(同じ) だったんだ。同じ「請求と入金」でも、=でくらべると同じ、IF の中で引き算すると NG。今日の表では、式の書き方で答えが分かれたんだよ。

3. ⭐ ROUND(差,2)=0 にしたら、10行とも OK になったんだよ

チェックの式を、こう変えたんだ。

前 =IF(C2-D2=0,”OK”,”NG”)
後 =IF(ROUND(C2-D2,2)=0,”OK”,”NG”)

ROUND(C2-D2,2) は、「差を小数2けたに四捨五入する」という意味だよ。小さなずれを丸めてから、0とくらべるんだ。

⚠️ ただ、丸めたせいで本当のずれまで見逃したら困るよね。だから13行目に、入金を 30.29 にした行も作ったんだ。請求は 30.3 だから、本当に 0.01 ちがう行だよ(30.3−30.29=0.01)。
ROUNDでの列を足した表。もとの差=0?は2・3・5・6行目がNGだが、ROUNDでの列は2行目から11行目までOK。入金を30.29にした13行目は、差=0?もROUNDでもNG。数式バーには =IF(ROUND(C2-D2,2)=0,"OK","NG") と出ている

2〜11行目(請求と入金が同じ) → ROUND で10行とも OK
13行目(本当に 0.01 ちがう) → ROUND でもちゃんと NG

⭐ 合っている行は OK にもどって、本当にちがう行は NG のまま。これなら、チェックの役目を果たしてくれるよね。

ほかにも、通った直し方が1つあったよ。

差の列(E列 =C2-D2)を別に作って、その列を =IF(E2=0,”OK”,”NG”) で見る
→ 2〜11行目は10行とも OK、13行目は NG

差のセルの中身は 0 だったから、そのセルを見れば OK になったんだ。でも、A君がまず覚えるのは、ROUND(差,2)=0 のほうでいいと思うよ。差の列がない表でも、チェックの式1つで書けるからね。

4. 0.1を10行足した合計でも、同じことが起きたんだよ

別のシートで、0.1を10行ならべて、=SUM(A2:A11) で合計したんだ。入金は 1 にしたよ。0.1を10個足せば 1 だから、合っているはずだね。

=SUM(A2:A11) → 見た目は 1
差 =C2-D2 → 0
=IF(C2-D2=0,”OK”,”NG”) → ⚠️ NG
=C2=D2 → TRUE
=(C2-D2) → -1.1E-16
ROUND にしたチェック → OK

合計の式の中で、そのまま引き算しても同じだったよ。

=SUM(A2:A11)-D2 → 0
=IF(SUM(A2:A11)-D2=0,”OK”,”NG”) → ⚠️ NG
=SUM(A2:A11)=1 → TRUE

⇒ 足して出した数を、IF の中で引き算して0とくらべると、ずれが出ることがある。足し算の式でも、SUM でも、同じだったんだよ。

5. ⚠️ 探す式でも、COUNTIF は「ある」、MATCH と VLOOKUP は #N/A だったんだよ

計算で出した請求の列(=A2+B2 で作った列)から、30.3 や 3.3 を探す式も試したんだ。探す値は、手で入れた数だよ。

COUNTIF → 請求の列に、探す値が何件あるか
MATCH → =MATCH(F4,$C$2:$C$11,0) の形で、何番目にあるか(最後の0は、ぴったり同じものを探す)
VLOOKUP → FALSE(ぴったり同じものを探す)をつけて、となりの名前を引く

計算で出した請求の列から値を探した表。COUNTIFはどれも1。MATCHとVLOOKUPは30.3、3.3、57.9、0.8で#N/A。300.9はMATCHが3でVLOOKUPが上野、6.6はMATCHが6でVLOOKUPが加藤。数式バーには =MATCH(F4,$C$2:$C$11,0) と出ている

探す値 COUNTIF MATCH VLOOKUP
30.3 1 ⚠️ #N/A ⚠️ #N/A
3.3 1 ⚠️ #N/A ⚠️ #N/A
300.9 1 3 上野
57.9 1 ⚠️ #N/A ⚠️ #N/A
0.8 1 ⚠️ #N/A ⚠️ #N/A
6.6 1 6 加藤

⭐ COUNTIF は「1件ある」と言っているのに、MATCH と VLOOKUP は見つからない(#N/A)。#N/A になったのは、30.3・3.3・57.9・0.8 で、1章で NG になった4行と同じ数だったんだ。

ここで通った直し方は、探される側の列を丸めておくことだよ。

請求の列の横に =ROUND(C2,2) の列を作って、そこから MATCH で探す
→ 6つとも見つかった(1・2・3・4・5・6番目)

「入っているのに #N/A」になる原因は、ほかにもあるよ。VLOOKUP で #N/A が出る記事や、見えない空白で一致しない記事もあわせて見てみようか。

6. よく知られた 0.1+0.2 でも、たしかめてみたんだよ

小数のずれの話でよく出てくる 0.1+0.2 と、1.1−1 も試したよ。

=0.1+0.2 → 0.3
=0.1+0.2-0.3 → 0(指数表示でも 0.00E+00)
=(0.1+0.2-0.3) → 5.55E-17
=0.1+0.2=0.3 → TRUE
=IF(0.1+0.2-0.3=0,”OK”,”NG”) → ⚠️ NG
=ROUND(0.1+0.2,10)=0.3 → TRUE

=1.1-1 → 0.1
=1.1-1-0.1 → 0
=(1.1-1-0.1) → 8.33E-17
=1.1-1=0.1 → TRUE

⇒ 請求と入金の表と同じ形だったよ。セルの答えは 0 に見えるのに、かっこで包むと小さな数が出て、IF の中の引き算は NG。=でくらべると TRUE だったんだ。

7. ⚠️ 今日測れなかったこと

・測ったのはMac版のエクセル(16.113.2)だよ。Windows版で同じになるかは、分からないんだ
・「表示桁数で計算する」という設定は、ブックの中の数を書きかえてしまうので、触っていないよ
・条件付き書式やフィルターで、どう見えるかは試していないんだ
・税込みの計算で1円ずれる話は、今日は試していないよ
・なぜ差のセルだけ 0 になるのかの仕組みは、エクセルの公式の説明を読んでいないから、分からないんだ
・=でくらべると今日の10行は TRUE だったけれど、全部の数で確かめたわけではないよ
・小数18けたで表示しようとした列は、列の幅が足りなくて ######## になってしまって、測りそこねたんだ
・表も式も、命令(プログラム)で作って読んだよ。手で入れたときは試していないんだ。数字と名前は、試しに作ったものだよ

8. エクセルの記事、これで33本目だよ

30本目は、人日の合計と人月が合わない話だったね。あれは、計算は合っていて、丸める場所がちがうだけだったんだ。

今日は、見た目では同じ数や0なのに、IFの中の引き算や、MATCHで探すときにずれた話なんだ。どちらも、くらべる前にROUNDしておいたら合ったんだよね。

結論:差のチェックは、ROUND(差,2)=0 で書こうか。0に見えても、引き算は少しずれることがあるんだよ

今日試した結果をまとめるとこうだよ。

① 請求と入金が同じなのに、=IF(C2-D2=0,”OK”,”NG”) は10行のうち4行で NG
② 差のセルは 0。でも =(C2-D2) とかっこで包むと -3.6E-15 などの小さな数が出た
③ =C2=D2 と COUNTIF は「同じ」「ある」とみなした。MATCH と VLOOKUP(ぴったり探す)は #N/A
④ ROUND(C2-D2,2)=0 にしたら10行とも OK。本当に 0.01 ちがう行は NG のまま
⑤ 差の列を作ってその列を見る、探される側の列を ROUND しておく、でも通った

チェックの式がまちがって NG を出すと、合っているものを疑って時間を使ってしまう。小数の引き算は、くらべる前に丸めておこうか。

よくある質問

Q1. =C2=D2 でくらべれば、ROUND はいらないですか

今日の10行では、=C2=D2 はぜんぶ TRUE だったよ。0.1+0.2=0.3 も TRUE だったんだ。⚠️ でも、全部の数で確かめたわけではないんだよね。だから「=でくらべれば必ず大丈夫」とは言えないよ。⇒ 今日の表では、ROUND(差,2)=0 にすると、合っている行は OK、本当に 0.01 ちがう行だけ NG になったよ。差のチェックは、こちらで書いておこうか。

Q2. 表示形式を変えれば、ずれに気づけますか

指数の表示では、気づけなかったよ。差のセルは、表示を指数に変えても 0.00E+00 のままだったんだ。小数18けたで表示しようとした列は、列の幅が足りなくて ######## になってしまったから、そちらで気づけるかは分からないんだ。⇒ 今日ずれが見えたのは、=(C2-D2) とかっこで包んだ式のほうだったんだよ。

Q3. Windows版のエクセルでも、同じですか

⚠️ Windows版は試していないから、分からないんだ。今日測ったのは、Mac版のエクセル(16.113.2)だけだよ。ROUND にしたら合っている行は OK、本当に 0.01 ちがう行は NG になった、というのも、Mac版で確かめた結果なんだ。

【本日のミッション:差のチェックを、ROUND してからくらべてみようか】

  • ☐ 自分の表で、=IF(C2-D2=0,…) のように、IF の中で引き算して0とくらべている式がないか探してみようか
  • ☐ 見つけたら、=IF(ROUND(C2-D2,2)=0,”OK”,”NG”) に書きかえて、NG の数が変わるか見てみようか
  • ☐ 計算で出した列を MATCH や VLOOKUP で探して #N/A が出たら、=ROUND(C2,2) の列を作って、そこから探してみようか
  • ☐ (後輩A君へ)NG が出ても、まちがいとはかぎらないんだよ。差を丸めてから、もう一度くらべてみようか

📚 AI活用シリーズ(おすすめ)

▼ シリーズの全記事一覧を見る

コメント

タイトルとURLをコピーしました