調べて分かる道具箱

なぜ0で割ってはいけないのか(ゼロ除算)

割られる数を選ぶ
自分で入れることもできます3 や -0.5 のような10進の書き方で入れてください

いまの割る数は 1 (1そのもの・プラス側)

答え
1 ÷ 1 =1
何が起きているか
割る数を10分の1にすると、答えは10倍になります。プラス側から 0 に近づけるほど、答えはどこまでも大きくなっていきます。
数学では
割る数が 0 でないときは、答えはただ1つに決まります。答えに割る数をかけ算すると、割られる数にきちんと戻ります。
コンピュータでは
コンピュータも同じ答えを返します。JavaScript が返す値は 1 です。
JavaScript が返す値
1 / 1 → 1

入れた数はこのブラウザの中だけで計算しています。

よくある質問

0で割ると無限大になるのですか?

なりません。1を0.1、0.01、0.001と小さい数で割ると答えは10、100、1000と大きくなりますが、マイナス側から近づけると-10、-100、-1000とどんどん小さくなります。プラス側とマイナス側で向かう先が正反対なので、0で割った答えを1つに決めることができません。「無限大」という1つの答えがあるのではなく、答えが決められないのです。

どうして0で割ってはいけないのですか?

わり算は、かけ算の逆をたどる計算だからです。6÷3が2なのは、3に2をかけると6になるからです。同じように1÷0の答えは「0にかけると1になる数」ですが、どんな数に0をかけても答えは0なので、そんな数は1つもありません。答えになれる数が存在しないので、割り算そのものが成り立ちません。

0÷0も決められないのですか。1÷0と何が違いますか?

どちらも決められませんが、理由が正反対です。1÷0は「0にかけると1になる数」が1つも無いから決められません。0÷0は「0にかけると0になる数」が3でも5でも100でも当てはまってしまい、多すぎて1つに決められないのです。片方は候補がゼロ、もう片方は候補が無数、という違いです。

JavaScriptで1÷0がエラーにならないのはなぜですか?

IEEE 754という、コンピュータが小数をどう扱うかを決めた世界共通の取り決めに従っているからです。JavaScriptの仕様書(ECMA-262)は割り算をこの規格どおりに行うと定めていて、1/0はInfinity、-1/0は-Infinity、0/0はNaN(数ではない)を返します。計算のたびに止まらないようにするための決めごとであって、数学として「答えが無限大」だという意味ではありません。

マイナスのゼロ(-0)とは何ですか?

JavaScriptには0が2つあります。ふつうの0とマイナスの0です。0 === -0 はtrueになるので、イコールを3つ並べた比べ方では見分けられません。ところが Object.is(0, -0) はfalseになり、こちらは見分けます。割り算でも違いが出て、1/0はInfinity、1/-0は-Infinityです。画面に出そうとしても、-0は「0」としか書けません。

0÷5はどうなりますか?

0になります。決められないのは「0で割ったとき」で、「0を割ったとき」ではありません。0÷5の答えは「5にかけると0になる数」で、それは0だけです。ただ1つに決まるので、ふつうの割り算として成り立ちます。5÷0と0÷5は見た目が似ていますが、まったく別の話です。

割る数を1 → 0.1 → 0.01と 0 に近づけると、答えはどんどん大きくなります。 ところがマイナス側から近づけると、どんどん小さくなります。 つまみを動かして、両側で行き先が食い違うところを見てください。

「0で割ると無限大」は、正しくありません

学校で「0で割ると無限大」と教わることがあります。 けれど、これは正しくありません。 なぜそう言えるのかを、実際の数で見ていきます。

下の表は、1 を、0 に近い数で割った答えです。 たとえば2段目は1 ÷ 0.1 = 10 と 1 ÷ -0.1 = -10 のこと。0 からの距離は同じで、符号だけが違う数を両側から使っています。

1を、プラス側とマイナス側の両方から0に近い数で割った答え。左の列が割る数、 まん中がプラス側の割る数で割った答え、右がマイナス側の割る数で割った答え
割る数プラス側の答えマイナス側の答え
1 と -11-1
0.1 と -0.110-10
0.01 と -0.01100-100
0.001 と -0.0011,000-1,000
0.0001 と -0.000110,000-10,000

下へ行くほど、左の列は大きくなり、右の列は小さくなります。同じだけ 0 に近づけているのに、2つの列は正反対の方へ走っていきます。

近づけていったときの行き先のことを、数学では極限(きょくげん)と言います。 0 で割った答えを決めたいなら、プラス側から近づけた行き先と、マイナス側から近づけた行き先が一致していなければなりません。 ところがこの2つは一致するどころか、正反対です。だから「答えは決められない」のです。

「無限大」という1つの答えがある、のではありません。答えを1つに決める方法が無い、というのが本当のところです。

わり算は「かけ算の逆」。0 にかけて 1 になる数はありません

なぜ決められないのかを、わり算の意味から見てみます。6 ÷ 3 が 2 なのは、3 に 2 をかけると 6 になるからです。 わり算はかけ算の逆をたどる計算です。

同じ言い方をすると、1 ÷ 0 の答えは「0 にかけると 1 になる数」です。 では、そんな数はあるでしょうか。 0 × 3 は 0、0 × 100 は 0、0 × 1000000 も 0 です。どんな数に 0 をかけても、答えは 0 にしかなりません。

つまり、1 ÷ 0 の答えになれる数は1つもありません。 「大きすぎて書けない」のではなく、そもそも存在しないわけです。

0 ÷ 0 は、決められない理由が違います

ここは分けて覚えてほしいところです。0 ÷ 0 も決められませんが、1 ÷ 0 とは理由が正反対です。

0 ÷ 0 の答えは「0 にかけると 0 になる数」です。 さっきと同じように探すと、 今度は3 でも 5 でも 100 でも当てはまります。 3 × 0 も 5 × 0 も 100 × 0 も、全部 0 だからです。

1 ÷ 0
当てはまる数が1つも無いから決められない0 にかけて 1 になる数は存在しない
0 ÷ 0
当てはまる数が多すぎるから決められない0 にかけて 0 になる数は、どんな数でもよい

候補がゼロなのと、候補が無数にあるのと。どちらも「1つに決められない」という結果は同じですが、行き詰まり方はまったく違います。 上の道具で割られる数を0 にすると、コンピュータの答えも別のもの(NaN)に変わります。

コンピュータは Infinity や NaN を返します(数学の答えではありません)

ここからはコンピュータの話です。 ウェブページを動かしているJavaScriptという言葉(プログラミング言語)では、1 ÷ 0 はエラーになりません。 Infinity(インフィニティ) という値が返ってきます。

1 / 0
Infinity が返る
-1 / 0
-Infinity が返る
0 / 0
NaN が返るNot a Number(数ではない)の頭文字

ここを取り違えないでください。これはIEEE 754(アイ・トリプルイー ななごーよん)という、 コンピュータが小数をどう持ってどう計算するかを決めた世界共通の取り決めでそう決めてあるだけです。 JavaScript の仕様書は、割り算を「IEEE 754-2019 のとおりに行う」と書いています(新しいタブで開きます)。

数学として「答えが無限大」だと言っているのではありません。計算のたびにプログラムが止まってしまうと困るので、止まらずに先へ進むための値を決めてある、というだけです。 実際 Infinity は、そのあとの計算でだいたい行き止まりになります ── Infinity - Infinity も 0 × Infinity も NaN です。

面白いのは、割る数が 0 でなくても Infinity になることがある点です。 JavaScript が持てる一番大きい数は、およそ 1.8 のうしろに 0 が 308 個ならんだ数までです。 だから、小数点のあとに 0 が 308 個ならんでから 1 が来るほど小さい数で割ると、 答えがその入れ物に入りきらず、割る数が 0 でないのに Infinity になります。Infinity が出た = 0 で割った、ではないわけです。

JavaScript には 0 が2つあります

もう1つ、知っておくと得をする話があります。JavaScript には 0 と -0(マイナスのゼロ)の2つがあります。上のつまみで真ん中に 0 が2つ並んでいるのは、そのためです。

0 === -0
true(同じだと判定される)イコールを3つ並べた比べ方では見分けられない
Object.is(0, -0)
false(別物だと判定される)見分けられるのはこちらだけ
1 / -0
-Infinity(1 / 0 とは符号が反対)

同じだと判定されるのに、割ると答えの符号が変わります。しかも -0 を画面に出そうとしても「0」としか書けません(JavaScript が文字にするときに符号を落とすためです)。見た目でも比べ方でも見分けられないのに、割り算にだけ違いが出る── だからここは、知らないとつまずくところです。

これは思いつきではなく、仕様書にそう書いてあります。ECMA-262 の SameValue の項(新しいタブで開きます)に「この手続きは、すべての NaN を同じものとして扱う点と、+0 と -0 を区別する点で、厳密等価(イコール3つ)と違う」と 書かれています。Object.is はこの SameValue をそのまま返す関数です。

電卓に入れると、機種によって出るものが違います

紙の上と JavaScript の話をしてきましたが、電卓はまた別です。「E」とだけ出るもの、「Error」と出るもの、日本語で理由を出すものがあります。 表計算ソフトでは、また違う書き方のエラーが出ます。

どれが出るかは機種やソフトによって違うので、 ここでは「こう出ます」とは書きません。 手元の電卓で1 ÷ 0 = を実際に押してみてください。どんな表示が出ても、意味は同じです ──答えが決められないので、返せる数がありません、ということです。

JavaScript の動きは、実際に動かして確かめたうえでECMA-262 の Number::divide の項(新しいタブで開きます)と突き合わせています。仕様書は、割る数が +0 のときは割られる数が正なら +∞・ そうでなければ -∞、割る数が -0 のときはその逆、割られる数も割る数も 0 のときは NaN と定めています。 この対応は単体テストに固定してあるので、動きが変わればテストが落ちます。