剰余と切り捨て除算
1000 円を 3 人で割ると 333.3333333333333 円
飲み会の割り勘を計算させてみます。
Python
print(1000 / 3)333.3333333333333 と出ます。お金にこの答えは使えません。ほしいのは「1 人 333 円ずつ出して、1 円あまる」という形です。
そもそも / は、割り切れる場合でも必ず小数を返します。10 / 2 ですら 5.0 です。整数がほしい場面では、別の記号を使います。
商の // と余りの %
// は割り算の答えの小数部分を切り捨てて整数だけを返し、% は割ったときの余りを返します。
Python
print(1000 // 3)
print(1000 % 3)333 と 1 です。333 を 3 倍すると 999 なので、1000 との差の 1 が確かにあまります。この 2 つは常にセットで、割られる数は「商かける割る数、足す余り」に戻ります。
% は百分率とは何の関係もありません。読み方は「モジュロ」または「あまり」です。50 % 100 は「50 パーセント」ではなく、50 を 100 で割った余りの 50 になります。
割り切れるかを調べる
% のいちばん有名な使い道が「割り切れるか」の判定です。余りが 0 なら割り切れています。
Python
print(10 % 2 == 0)
print(7 % 2 == 0)True と False で、偶数と奇数を分けられました。% 3 にすれば 3 の倍数が見つかります。
なお // も % も、0 で割ると ZeroDivisionError になります。人数のように 0 になりうる値で割るときは注意してください。エラーの名前は読めば意味が分かるように付いていて、これも「ゼロで割った」とそのまま書いてあります。
やってみよう
関数 split_bill を実装してください。引数は合計金額 total と人数 people の 2 つで、割り勘の結果を下記の形の文字列で返します。
Python
1人 333円 あまり 1円1人 のあとに 1 人あたりの金額、円 あまり のあとに余りの金額、最後に 円 です。半角スペースの位置に気をつけてください。
split_bill(1000, 3) なら上のとおり、split_bill(3000, 3) なら 1人 1000円 あまり 0円 です。割り切れるときも あまり 0円 と書き出します。
1 人あたりの金額に / を使うと小数になってしまうので、そこは切り捨てのほうを使います。f-string の {} の中には計算式をそのまま書けるので、いったん変数に入れてから埋めても、その場で計算しても構いません。読みやすいほうを選んでください。
要件
- 関数名は split_bill で、引数は total と people の2つ
- 1人あたりの金額は // で求める(/ を使うと小数になる)
- 端数は % で求め、割り切れるときも あまり 0円 と表示する
- 戻り値は "1人 333円 あまり 1円" と同じ形の文字列にする