アルゴリズム大好き人間、弓削田です。
難しい学問的なアルゴリズムではなく、プログラミングで簡単に使える嗜好的なアルゴリズムがもっぱら好きなんですが、
何かしらのシステムを作っていると、集計処理をする場面って、まあまあありますよね。
そんな時、日次処理や月次処理、長期間だと年次処理なんていうのも扱うことがあります。
今回は、最近作ったシミュレーションシステムの設定で、次のような設定があり、そのデータをどのように持たせて、どうやって集計をしたらいいかという課題があり、
まあまあ、うまく処理ができたので、似たような対応をする人の為に、この記事を書いておきます。
設定条件
ライフプラン・シミュレーションで、イベント登録をする時に、
定期的に、旅行に行く費用を算出する処理が今回の目的です。
選択する内容は次の4つです。
1. 毎月
2. 半年に一回
3. 毎年
4. 3年に一度
ちなみに、この頻度に加えて、家族の人数を掛け合わせて、1回につき、一人が
海外旅行の場合は25万円、国内旅行は3万円という値で計算するという仕様です。
これで、10年間の旅行費を算出するという内容なのですが、
さて、どのような方法で、プログラミングすればいいでしょうか?
データの持たせ方
この仕様をプログラミングするのに、何が難しいのかというと、
違う単位の値が存在するということですね。
まず、設定する時に、1ヶ月ごと、3年という違い、「月」と「年」の違いで、
それを「10年」という単位を基準にして計算するというのが、少し戸惑うポイントではないでしょうか?
あと、「3年ごと」というのを10年間でどのように計算すればいいか、わからない人もいるかもしれませんね。
とりあえず、こうした違った単位の場合は、一番小さな単位に合わせるということをすると、スッキリしました。
何で、「年」を全て「月」に変換するということです。
と言うことで、
毎月を、1という値にすると、
毎年は、12の値で扱います。
ということで、次のようにデータ設計をしてみました。
1. 毎月 : 1
2. 半年に一回 : 6
3. 毎年 : 12
4. 3年に一度 : 36
計算方法
設定したデータで10年の間の指標を求める時に、javascriptで次のように書いてみました。
let data = [
{
name : "毎月",
value : 1
},
{
name : "半年",
value : 6
},
{
name : "1年",
value : 12
},
{
name : "3年",
value : 36
}
];
let input = 0; // ユーザーが入力した値(dataの配列番号)
let step = data[input].value;
let cost = 10000; // 旅行のコスト
let total = 0; // 合計値算出用
for(let i=0; i<10; i=i + Math.ceil(step/12)){
total += cost * Math.ceil(12/step);
}
console.log(total);
ポイントは、
for分のMath.ceil(step/12)と、
コスト計算の、
total += cost * Math.ceil(12/step);の箇所です。
for分では、1年ごとのloopをして、通常インクリメントする箇所を、月を基準としたstepですが、ceilは、整数値に繰り上げする処理で、
1ヶ月でも半年でも、小数点になる場合は、1になるようにして、10年間を10回ループさせるようにします。
この時に、3年ごとというのは、3ごとの増加になるので、結果的に3年ごとの処理をすることができます。
次にコスト計算の箇所では、似たような計算が書かれていますが、さきほどは、"step/12"となっていた箇所が、"12/step"となっているところがミソです。
これは、1年の間に何ヶ月分の回数を掛けてコスト計算をしています。
もっと長くなる感じがしていたプログラムですが、意外とシンプルにできて、
こうした処理って、書き残しておかないと、忘れてしまいそうなんですよね。
使える人がいたら、使ってくださいまし。
0 件のコメント:
コメントを投稿