私たちの身の回りには「小数」が溢れています。身長や体重、100m走のタイムや野球の打率、料理のレシピ、為替レート、さらには畑の酸性度測定など、小数の計算は私たちの生活のあらゆる面で必要とされており、数え上げればきりがありません。小数は身近ではありますが、小学校の算数で躓きやすい単元の一つでもあります。
この記事では、普段頭の中や紙の上で行っている小数の計算をPythonのプログラミングを通して整理し、具体的なコード例を通じてそれらの概念を深く理解することを目指しています。
Pythonはそのシンプルさと直感性から初心者にも扱いやすく、教育現場で広く使われています。この記事を通じて、小数の計算の理解を深めるだけでなく、プログラミングスキルも身につける一助となれば幸いです。
Pythonで小数を扱う方法
Pythonでは、小数は小数点を使って表現します。例えば、「2.5」や「0.75」のように書くことができます。これらの数値は Pythonではfloat型と呼ばれ、様々な計算に利用することができます。
また、Pythonでは四則演算(加算+、減算-、乗算*、除算/)が直感的に行えます。これらの演算子は、小数同士だけでなく、整数(int型)と小数(float型)の間でも自由に使用することができます。例えば、「2.5 + 0.75」を計算すると、「3.25」が得られます。
Pythonで小数を扱う際には注意点もあります。コンピュータは二進法を基に計算を行うため、十進法で表現される小数を正確に表現することができない場合があります。例えば、「0.1 + 0.2」を計算すると、「0.30000000000000004」という結果が得られることがあります。これは「浮動小数点数の誤差」と呼ばれる現象で、これを理解しておくことは重要です。 高精度の計算が必要な場合(例えば金融や科学技術計算など)には、専用のライブラリ(例えばPythonのdecimalモジュールなど)を使用することで回避することができます。
Pythonで小数の計算をする
このセクションでは、机上で小数の加算・減算と乗算・除算を行う際の具体的な手順を考えます。それぞれの計算手順を理解した上で、その手順をPythonを使ったプログラミングで表現します。

小数点の加算と減算
まず、小数の加算と減算について考えます。これらの計算を机上でする際には、通常、小数点を揃えるために桁合わせを行います。一方、プログラムで計算する際にその必要はありませんが、机上での計算手順を念頭にプログラミングで表現してみます。
# 小数の定義
num1 = 2.5
num2 = 0.75
print("●もとの数値\n", num1, num2)
# 小数点以下の桁数を揃える
num1_str = format(num1, '.2f')
num2_str = format(num2, '.2f')
print("●桁合わせ後の数値\n",num1_str,num2_str)
# 加算
print("●加算")
print(" ",num1_str)
print("+",num2_str)
print("-------")
print(" ", float(num1_str) + float(num2_str))
# 減算
print("●減算")
print(" ",num1_str)
print("-",num2_str)
print("-------")
print(" ", float(num1_str) - float(num2_str))
小数点の乗算
次に、小数の乗算について考えてみましょう。これらの計算では、一旦整数部と小数部に分けて計算を行い、最後に結果を合わせるという手順が一般的です。Python でも同様で、以下のようなコードで表現することができます。
#小数の定義
num1 = 2.5
num2 = 0.75
#整数部と小数部に分ける
int_part1, dec_part1 = str(num1).split('.')
int_part2, dec_part2 = str(num2).split('.')
#乗算
result = (int(int_part1) * int(int_part2)) + (int(dec_part1) * int(dec_part2)) / (10 ** len(dec_part1))
print("結果:", result)
小数点の除算
最後に除算について考えます。小数の除算は、加算や減算、乗算と比べて少し複雑ですが、こちらも紙の上で手計算を行う手順を考えてみます。
- 除数の小数点を取り除く: 除数の小数点を右に移動して整数にし、その分だけ被除数の小数点を右に移動します。
- 除数と被乗数との除算: 小数点を取り除いた除数と小数点の位置を変更した被除数との除算を行います。
- 結果に小数点を追加: 小数点を移動させた位置を考慮して、商と余りに小数点を追加します。

以下に、この手順をPythonで実装したサンプルプログラムを示します。
def decimal_division(divd, divs):
"""
小数の割り算を筆算でシミュレートする関数
Args:
divd (float): 被除数
divs (float): 除数
Returns:
tuple: 商と余りのタプル
"""
# 除数が0の場合のエラー処理
if divs == 0:
raise ValueError("除数が0です。0で割ることはできません。")
# 被除数と除数を文字列に変換
divd_str = str(divd)
divs_str = str(divs)
# 小数点の位置を取得
divd_dec_pos = divd_str.find('.')
divd_dec_pos_orig = divd_dec_pos
divs_dec_pos = divs_str.find('.')
# 除数の小数点を右に移動し、小数点を取り除く
if divs_dec_pos != -1:
divs_str = divs_str.replace('.', '') # 小数点を取り除く
divs_dec_pos = len(divs_str) - divs_dec_pos # 小数点を右に移動した桁数
divs_str = divs_str.lstrip('0') # 先頭の0を取り除く
else:
divs_dec_pos = 0 # 小数点がない場合は0
# 被除数の小数点を除数で移動した分のみ右に移動する
if divd_dec_pos != -1:
divd_str = divd_str.replace('.', '') # 小数点を取り除く
else:
divd_dec_pos = len(divd_str) #小数点がない場合は右端にあるとみなす
divd_dec_pos_orig = divd_dec_pos
divd_dec_pos += divs_dec_pos # 小数点の移動を反映
if len(divd_str) <= divd_dec_pos:
divd_str = divd_str + '0' * (divd_dec_pos - len(divd_str)) # 右端をはみ出す場合は0埋めする
else:
divd_str = divd_str[:divd_dec_pos] + "." + divd_str[divd_dec_pos:] # 小数点を右に移動
# 小数点の移動のイメージ表示
print(" " + len(str(divs))*" " + len(str(divd))*2*"-")
print(f"{divs} ){divd}\n")
print("小数点の移動 ↓ ↓ ↓\n")
print(" " + len(divs_str)*" " + len(divd_str.lstrip('0'))*2*"-")
print(f"{divs_str} ){divd_str.lstrip('0')}\n")
# 被除数を一桁ずつずらしながら除数で割れるか確認
divd_str_tmp = ""
quot_str = ""
for i in range(len(divd_str.replace('.',''))):
divd_str_tmp += divd_str.replace('.','')[i] # 桁を追加
if int(divs_str) <= int(divd_str_tmp):
quot_int_tmp = int(divd_str_tmp) // int(divs_str) # 商を計算
rem_str = f"{int(divd_str_tmp) % int(divs_str):0{len(divd_str_tmp)}d}" # 余りを計算
print(f"{int(divd_str_tmp)} // {int(divs_str)} = {quot_int_tmp} (余り: {int(rem_str)})\n")
divd_str_tmp = rem_str # 余りを次の桁に使用
quot_str += str(quot_int_tmp) # 商を結果に追加
else:
quot_str += "0" # 現在の被徐数が除数より小さい場合、結果(商)の左端を0で埋める
rem_str = divd_str_tmp # 現在の被除数を余りとして保持
# 結果に小数点を追加
quot_str = quot_str[:divd_dec_pos] + '.' + quot_str[divd_dec_pos:] # 商の小数点の位置を反映
rem_str = rem_str[:divd_dec_pos_orig] + '.' + rem_str[divd_dec_pos_orig:] # 余りの小数点の位置を反映
return float(quot_str), float(rem_str) # 商と余りを浮動小数点数として返す
# テスト
dividend = 2.555
divisor = 0.75
try:
quotient, remainder = decimal_division(dividend, divisor)
print(f"{dividend} ÷ {divisor} = {quotient} (余り: {remainder})\n")
except ValueError as e:
print(e)
このコードは、手計算の手順をプログラムで再現し、被除数と除数の小数点の位置を移動した上で除算を行い、最終的に結果に小数点を追加することで、小数点を含む除算を実現しています。
1.関数の定義
decimal_divisionという名前の関数を定義しています。この関数は2つの引数を取ります:divd(被除数)とdivs(除数)。この関数は、商と余りのタプルを返します。
2.除数が0の場合のエラー処理
除数が0の場合、エラーを発生させます。これは、数学的に0で割ることはできないためです。
3.被除数と除数を文字列に変換
被除数と除数を文字列に変換します。これにより、小数点の位置を簡単に見つけることができます。
4.小数点の位置を取得find関数を使用して、被除数と除数の小数点の位置を見つけます。
5.除数の小数点を右に移動し、小数点を取り除く
除数の小数点を右に移動し、小数点を取り除きます。これにより、除数は整数になります。
6.被除数の小数点を除数で移動した分のみ右に移動する
被除数の小数点を除数で移動した分だけ右に移動します。これにより、被除数と除数の小数点の位置が揃います。
7.小数点の移動のイメージ表示
小数点の移動を視覚的に表示します。これにより、筆算の過程を理解しやすくなります。
8.被除数を一桁ずつずらしながら除数で割れるか確認
被除数を一桁ずつずらしながら除数で割れるか確認します。除数で割れる場合は、商と余りを計算します。
9.結果に小数点を追加
最後に、商と余りに小数点を追加します。
10.結果を返す
商と余りを浮動小数点数として返します。
このプログラムを「Google Colaboratory」にコピペして実行することができます。「Google Colaboratory」については次の記事もご参照ください。
Pythonの開発と実行には様々なツールがありますが、、初心者にとって特におすすめなのが「Google Colab(正式名称「Colaboratory」)」です。 「Google Colab」は、ブラウザ上で動作するクラウドベースの[…]
このプログラムを実行した結果は次の通りです。除数(divisor)と被除数(dividend)の数値を input関数で入力させるコードを追加するなどして試してみてください。

以上のように、Python で小数の計算を行う際には、紙上で行う手計算の手順をプログラムに反映させることが可能です。これにより、小数の計算の理解をより深めることができます。
まとめ
少数の計算は日常生活や科学技術の中で頻繁に使用されています。この記事では、Python で少数をどのように表現し、基本的な四則演算(加算、減算、乗算、除算)の計算手順をPythonで行う具体的な方法を紹介しました。
これらの知識とスキルの獲得によって、今後の学習や実生活での問題解決に役立つことを願っています。更に難易度の高い計算や、他のプログラミング概念(例えば関数やクラスなど)に挑戦してみてください。