pythonの割り算の問題

in #japanese4 years ago

割り算

Pythonの割り算は、ExcelやCやJavaの言語を最初に覚えた人からみると、困惑する場合がある。つまり、悔過が異なることがある。どっちが正しいかという問題ではない。定義の違いである。

人に説明していて、困ったのでまとめてみた。

まず、割り算の定義とは、から考えてみる。
数学的な定義は、「乗法の逆元をかけること」となっている。
10個のリンゴを3人で分けると一人何個かという考え方ではない。つまり、次のようになる。
10÷3は、10×0.3となる。
1より小さい数で割ると増えるのも納得できる。
10÷0.3は、10×3である。
10個のリンゴを0.3人で分けると0.3人では、いくつにぶんかつされるかと考えると考えられなくもないが、まちがいである。

割り切れないときの考え方

さて、10÷3は実際にはどうなるのであろうか。
そのまま計算すると、3.33333333...となる。そして、小数点以下は切り捨てると考える。つまり、3となる。

負の数の考え方1

Pythonの場合に、割る数も割られる数も同じ符号なら答えは、正になる。つまり、
10÷3 は 3
-10÷(-3)は 3
である。

割る数と割られる数の符号が違うときは、答えは府になる。つまり、次の場合には負の符号となる。
10÷(-3)
-10÷3
ここで問題になるのが、この答えである。実数なら
-3.33333333...
である。つまり、
(-10)/ 3
10/ (-3)
は、-3.33333333...
である。
では、
(-10)/ / 3
10/ / (-3)
のこたえは、-4となる。-3ではない。CやJava言語やExcelは、-3である。どちらにマイナスの符号がついていても、符号を関係なく実数として計算して、それにマイナスの符号をつけている。

Pythonの場合には、-3.33333333...を切り捨てた値であるー4となる。
次の図を見てもらいたい。切り捨てとは、小数点をなくして、整数部分が一番小さくなる整数になることである。つまり、つぎの数直線上で、左に行くことである。つまり、3.33333333...は3
になり、-3.33333333...はー4になる。

image.png

あまりの考え方

余りはどうなるのか。Pythonはすごく簡単である。割り算の答えと割った数を掛け算して、余りを足すと、割られる数にもどればいい。つまり、

10 // 3 = 3  10 % 3 = 1
10 // (-3) = -4  -10 % (-3) = -2
(-10) // 3 = -4  (-10) % 3 = 2
(-10) // (-3) = 3  (-10) % (-3) = -1

となる。数学上はこちらが正しい。あまりに負の数がでてくつのは、小学校の算数では、説明できない。もともと負の数の割り算の説明がしずらい。