日割り計算を書き間違えた件

誰にでも失敗はあるものですが、反省の意を表すため、最近の失敗をここに告白します。年末に向けて皆様に笑っていただければと思います。

## 日割り計算ツールを作ったらカレーを奢ってもらえた件

つい先日、知人が「日割り計算が面倒なんだけど、簡単にできないかな？」と言っていました。
そこで、私は、「なでしこなら簡単なので作りますよ」と答えました。

それで、なでしこで数分で作成したものを、本人に見せると、「スゴイ、ありがとう」という感じで、とても喜んでもらえたのです。

そして、美味しいカレーを奢ってもらいました！！
以下は、ChatGPTが描いた、そのときの私のイメージ画像。ずいぶん、浮かれてましたね。

![そのときの私のイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/ef9d091f-d6c3-1945-d70a-c9ce5cb347bd.png)

それで、とても良い題材だったので、この顛末を元にして、以下のようなコラムも書きました。

https://news.mynavi.jp/techplus/article/nadeshiko-80/

これは、日割り計算の仕方を紹介するという趣旨のコラムでした。

## 日割り計算とは！!

ところが、、、しばらくして、、、知人からクレームがありました。

- 「正しい計算が出ない」
- 「全く意味のない計算結果が出力される」
- 「日割り計算の意味分かっているのか」などなど

えー？　どうしてー？

### ChatGPTに聞いた日割り計算とは？

そこで、改めて、ChatGPTに日割り計算について尋ねてみます。

```
「日割り計算」とは何ですか？
```

ChatGPTは日割り計算について下記のように答えました。

> 日割り計算（ひわりけいさん、英: proration）は、特定の期間内で発生した費用や収益を、その期間が一定でない場合に均等に配分するための計算方法です。日割り計算は、さまざまな金融やビジネスの文脈で使用されます。具体的な例として以下のいくつかを挙げてみましょう：
> 1. 家賃や賃貸料の日割り計算：入居や退去が1か月の途中で行われた場合、その期間内の家賃を日割りで計算して、テナントに対して適切な金額を請求します。
> 2. 給与の日割り計算：新入社員や退職者など、給与が雇用期間に応じて調整される場合、その期間内の給与を日割りで計算して支払われます。
> 3. 利息や配当の日割り計算：金融商品や投資に関連する収益や支出は、保有期間に応じて日割りで計算されます。たとえば、株式を保有した期間に発生した配当を日割りで計算し、投資家に支払われることがあります。
> 4. 保険料の日割り計算：保険契約が途中で変更された場合、その変更期間内での保険料を日割りで計算して請求されます。
> 日割り計算は、期間が一定でない場合に公平な取引や支払いを確保するために使用され、契約や取引の条件に従って行われます。計算方法は、期間の長さや特定のルールに応じて異なることがあります。

そんなこと、言われなくても、当然分かっていますとも！！

## 何を間違ったのか？

それで、自分の作ったプログラムを見直すと・・・私は、単に日付を2つと、金額を入力すると、金額を日数で割った値、以下のような計算を行っていました。

```
金額　÷　日数　＝　1日分の金額
```

これでは、日割りではなく、費用を日数で割った「1日の利用料金」です。日本語の「日割り」という言葉に惑わされていたのかもしれません。

当然、「日割り額」を出すためには、以下のような計算を書かないといけません。

```
金額　÷　本来の日数　×　日数　＝　日割り金額
```

痛恨のミスです。普通に考えれば、間違いようのないミスです。。。

### 間違ったプログラムと正しいプログラム

大変、恥ずかしいのですが、反省を込めて間違いを記しましょう。以下は、`利用料金の1日分`を計算するだけ、「間違った日割り計算」のプログラムです。

```間違った日割り計算.nako3
# --- 料金と日付を指定 ---
F利用料金は50000
「2023/10/15」から「2023/10/18」までの日数差をF日数に代入。
# --- 日割り料金を計算 ---
F日数 = F日数 + 1
F利用料金をF日数で割って、切り上げして、F日割り料金に代入。
# --- 結果を表示 ---
「{通貨形式(F利用料金)}円÷{F日数}日={通貨形式(F日割り料金)}円」を表示。
```

それで、本来の月半ば、`月の利用料金`を計算するのであれば、次のようにしなければなりません。

```正しい日割り計算.nako3
# --- 料金と日付を指定 ---
F利用料金は50000
「2023/10/15」から「2023/10/18」までの日数差をF日数に代入。
月日数=31
# --- 日割り料金を計算 ---
F日数 = F日数 + 1
F利用料金を月日数で割って、F日数を掛けて、切り上げして、F日割り料金に代入。
# --- 結果を表示 ---
「{通貨形式(F利用料金)}円÷{月日数}日×{F日数}日={通貨形式(F日割り料金)}円」を表示。
```

[なでしこ3簡易エディタ](https://nadesi.com/v3/start)で実行すると以下のように計算されます。正しい値が表示されています。

![スクリーンショット 2023-12-01 12.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/a7deb859-d8b5-7752-539a-6eded238407a.png)

# なぜ間違ったのか？ - 反省と改善案

それで、改めて、なぜ間違ったのかを分析してみました。

- 美味しいカレーを奢ってもらって、浮かれまくっていた
- 数分で仕事を片付けようと、仕事を終える時間に拘っていた

カレーに関しては、美味しかったので仕方がありません。
しかし、2つ目は私の奢りです。

なでしこを使うと、本当に簡単にプログラムが作れるので、

> 「あんなプログラム、10分もあれば余裕で作れますよー」

と言いたかったんです。

今考えるたら、`10分`ではなく、`15分`かければ良かったんです。

あと5分あれば、間違いに気づけたはずです。(たぶん）

とにかく、何をするにしても、見直しが大切ですね。

そして、分かりきっていることであっても、念のため調べたり確認する姿勢を大切にしたいです。
自分が何をして、その結果どうなったのかを、しっかり把握して人生を送りたいものです。

大いに反省して、このコラムを閉じたいと思います。


# (おまけ) プログラムの修正版

それで以下の二つのプログラムも、正しく計算できるように修正しました。

![スクリーンショット 2023-12-01 13.17.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/8bde5485-742b-e82b-a3cc-4260b9293cb1.png)

なでしこ3貯蔵庫に書き込んでいます。

以下のプログラムは、フォームに日付と金額を入力すると、年間（年の途中）の日割り計算を行います。

https://n3s.nadesi.com/id.php?2698

そして、月払いや、年払いの両方に対応するプログラムは、以下です。

https://n3s.nadesi.com/id.php?2648