[四則演算注意点] 数字を0で割ってはいけないプログラム計算式

Pocket
LINEで送る
GREE にシェア
LinkedIn にシェア

プログラミングで四則演算をする時に、割り算(除算)をする時に0を任意の数値で割る事は問題ないのだが、任意の数字 を0で割ってはいけないという数学的ルールがそれぞれの言語にも適用されるので、エラーを出さない様なプログラムをコーディングする必要があります。
 

当たり前のことだが中々意識してプログラムをする事がなかったので、調査を含めて、自分のコーディング規則を作成しておきます。
 

何故0で割ってはいけないかという理由がTED(Youtube)で説明されているので、知りたい人は見て見てください。
(英語です)
 

割り算についての調査

除法(割り算)のwikipedia
 

割り算は「除法」や「除算」が学術的な呼び名で、四則演算の二項演算のひとつとされます。
 

割り算の公式とそれぞれの名称は以下ようになっているので、覚えておくと説明する際などに便利でしょう。
 

被除数 ÷ 除数 = 商 … 剰余

 

プログラム言語別0で割った時の挙動チェック

PHP

 

 

「Warning: Division by zero」というwarningが出て「INF」というInfinityエラーが発生してしまいます。
 

「Infinity」は無限大という事で、プログラム内で無限ループが発生してしまう不具合なんですね。

Javascript

 

 

きちんと「Infinity」と表示されてしまってます。
 

このままグラフなどに数値代入しようとすると、そこでエラーになる事がわかります。

Ruby

 

「ZeroDivisionError」としっかり怒られます。
やはりこのまま使うと想定しない不具合に繋がりますね。
 

Python

 

Pythonは、HTMLタグでエラーを返すんですね。
知らんかった。
そして、やはり長めのエラー文言でしっかり怒られるので、これも不具合まっしぐらでしょう。
 

Shell

 

 

「Infinity」と怒られないですが、「division by 0」として怒られます。
 

また、exprで計算した場合もきちんと叱ってくれます。

Golang

 

 

Goは0で割る式があると、その場でプログラムが停止します。
途中まで実行もされずに、コンパイルエラーになるようです。
 

おそろしや・・・

どういうケースで発生しやすいのか・・・

0で割るケースってどういう時に発生するのでしょうか?
 

割り算を使うケースは、データの割合を出す場合に使うケースが圧倒的に多いので、レポーティングシステムなどで発生しがちです。
 

ECサイトなどで、複数商品ある売上の商品単価の平均を出したい場合、商品がまだ登録されていなければ、0で割ってしまう場面に遭遇します。
 

また、ユーザー登録するサービスなどで、ユーザー平均指標を出したい場合に、ユーザー登録が0人の場合も、0で割ってしまう事になります。
 

それらを防ぐために、0人の場合は、WEBページで事前にエラーを表示して、計算式まで辿り着けなくさせる対策を行ったり、0で割った場合の答えを0にしてしまう事で対応するのが一般的だと考えられます。
 

除数「0(ゼロ)」を考慮した記述

PHP

 

三項演算子を使って、結果を「0」として出力すると、不具合が発生しにくいプログラムになるでしょう。

JavaScript

 

JSも基本的には三項演算子でかるくクリアできます。

Ruby

 

rubyも普通に三項演算子で対応できます。

Python

 

Pythonの三項演算子は、通常の書き方と違うので要注意です。
 
これって普通にif文じゃんって思ったのは僕だけ?

Shell

 

shellはif文でないと安定して使えないですね。
 

Golang

 

Go言語は三項演算子が無いので、if文できちんと書きます。
 

Go言語のif文で注意すべきポイントは、elseの書き方が”} else {“と繋げて書かないとエラーになります。
間に改行を挟むとエラーになるので、最初はかなりハマってしまいましたが、非常に繊細な言語だと改めて感じました。

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です