質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1140閲覧

ローンの計算(元利均等)

nana727

総合スコア51

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/01/08 00:53

編集2020/01/08 01:51

イメージ説明
イメージ説明

前提・実現したいこと

元利均等のボタンを押されたら元利均等で処理を行う。

とりあえず、var_dumpで値を出したい。

変数名
借入金額:$money
返済方式、返済頻度(とりあえず無視)
金利:$interest_year
返済期間:$return

元利均等の計算式:上記画像

発生している問題エラーメッセージ

var_dumpでとりあえず出したい。
元利均等の公式を見ても全くわかりません。

元金均等は出せました。あとはループ処理で本格化を考えています。

該当のソースコード

PHP

//errorチェック $error = ["金額が入力されていません","半角英数字で入力してください", "金利が入力されていません","返済期間の欄が入力されていません"]; //定義されていません対策 $money = ""; $interest_year = ""; $return = ""; //入力値チェック if(empty($_POST["money"]) && isset($_POST["money"])){ $money_empty = $error[0]; }else{ if(isset($_POST["money"]) && isset($_POST["interest_year"]) && isset($_POST["return"])){ $money = $_POST["money"] * 10000; $original_money = $_POST["money"] * 10000; $interest_year = $_POST["interest_year"]; $return = $_POST["return"]; } if(empty($_POST["interest_year"]) && isset($_POST["interest_year"])){ $interest_error = $error[2]; } if(empty($_POST["return"]) && isset($_POST["return"])){ $return_error = $error[3]; } if(preg_match('/^[^ -~。-゚\x00-\x1f\t]+$/u', $money) && !is_numeric($money)){ //全角だったらここに来る $zenkaku = $error[1]; } if(preg_match('/^[^ -~。-゚\x00-\x1f\t]+$/u', $interest_year) && !is_numeric($interest_year)){ //全角だったらここに来る $zenkaku = $error[1]; }if(preg_match('/^[^ -~。-゚\x00-\x1f\t]+$/u', $return) && !is_numeric($return)){ //全角だったらここに来る $zenkaku = $error[1]; } //if文で元利均等か元金均等か判断する処理 //元利均等の処理 $a = $money * ($interest_year / 100 / 12 ) / pow((1 - (1 + $interest_year / 100 / 12)),-$return * 12); $a = var_dump($a); /*for($i = 0; $i < $return; $i++){ $money = ($money * $interest_year) / 1 - pow(($interest_year),$return);//1回目の残高元 $money = floor($money); var_dump($money); }*/ //元金均等の処理:表示結果OK /*$count = 1; for($i = 1 ;$i < $return * 12; $i++){ $a = $money / ($return * 12) + ($money - $money / ($return * 12) * ($i - 1)) * ($interest_year / 12); $count++; var_dump($count); }*/ } //切り捨て //切り上げ //四捨五入
html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>家計簿</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="css/bootstrap.css"> <link rel="stylesheet" href="css/loan.css"> </head> <body> <?php //家計簿の消費税計算画面 ?> <header> <ul> <li><a href="input.php">入力</a></li> <li><a href="index.php">カレンダー</a></li> <li>レポート</li> <li><a href="convenient.php">便利機能</a></li> <li>その他</li> </ul> </header><br> <h1>ローン返済</h1> <form action="" method="post"> <table> <tr> <th>借入金額</th><td><input type="text" name="money">万円</td> </tr> <tr> <th>返済方式</th> <div class="radio"> <td><input type="radio" checked class="radio-input" id="radio-01" name="avg" value="interest"> <label for="radio-01">元利均等</label> <input type="radio" class="radio-input" id="radio-02" name="avg" value="principal"> <label for="radio-02">元金均等</label> 端数<select name="round" id="" class="cp_ipselect"> <option value="floor">切り捨て</option> <option value="round">四捨五入</option> <option value="ceil">切り上げ</option> </select> </td> </div> </tr> <tr> <th>返済頻度</th> <div class="radio"> <td> <input type="radio" checked class="radio-inputs" id="radio-1" name="every" value="month"> <label for="radio-1">毎月</label> <input type="radio" class="radio-inputs" id="radio-2" name="every" value="half_year"> <label for="radio-2">半年毎</label> <input type="radio" class="radio-inputs" id="radio-3" name="every" value="year"> <label for="radio-3">毎年</label> </td> </div> </tr> <tr> <th>金利</th><td><input type="text" name="interest_year">%(年利)</td> </tr> <tr> <th>返済期間</th><td><input type="text" name="return">年 <select name="return_month" id=""> <?php for($i = 0;$i < 12;$i++):?> <option value="<?php echo $i;?>"><?php echo $i;?></option> <?php endfor;?> </select>ヵ月 </td> </tr> <tr><?php //入力エラー?> <th></th> <td class="text-danger">  <?php if(isset($money_empty)){echo $money_empty;} elseif(isset($zenkaku)){echo $zenkaku;} elseif(isset($interest_error)){echo $interest_error;} elseif(isset($return_error)){echo $return_error;} ?> </td> </tr> </table> <input type="submit" value="計算する" class="btn btn-info btn-lg"> </form> <hr> <h2>ローン返済(結果)</h2> <table class="loan_h2"> <tr> <th>回数</th><th>年/月</th><th>返済総額</th><th>元金文</th><th>利息分</th><th>借入残高</th> </tr> <tr> <td></td><td></td><td></td><td></td><td></td><td></td> </tr> </table>

試したこと

公式を見て式を当てはめてみたのですが、間違っているような気がします。
主にここを見ていただければ大丈夫です。
$a = $money * ($interest_year / 100 / 12 ) / pow((1 - (1 + $interest_year / 100 / 12)),-$return * 12);
var_dump($a);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetsunosuke

2020/01/08 01:04

やりたいことがよくわかりません。var_dumpで出したい、とありますが、それ自体は出ていて、数式の部分の、 > 間違っているような気がします。 についてもう少し説明していただけますか。 「気がする」と言われても・・・という感じでして、 例えば$moneyが1200で$interest_year が24のとき、$aがいくつになるはずなのになっていない、とかそういう「間違っていると思う根拠」が知りたいです。
m.ts10806

2020/01/08 01:23

>高校は偏差値42の高校で数学I,Aしかやっていないのが現状です。 これ不要では?何を伝えたいのでしょう。
nana727

2020/01/08 01:24 編集

ご指摘ありがとうございます。納得できました。 例えば、 金額に1万円 金利に10% 返済期間1年と入力します。 ここでは1年でかえすというものなので複利計算は発生しません。 返ってきてほしい値は1.1(1(金額) * 0.1 (利息))となるとおもうのですが、下記の値で返ってきてしまいます。 float(9.3463878987175E-24) このことからこの計算式は間違っていると結論付けいたしました。
nana727

2020/01/08 01:34

結論から申し上げますと関係ありません。 しかし、他のサイトを閲覧する限り、習っていない公式また数学II,Bで使われるものばかりでした。 仮に、それらを学んでいればサイトを見て理解できたのにという悔やみです。 厚かましいとは思いますが、それらを使わずに考慮して教えて頂けたら幸いです。
tetsunosuke

2020/01/08 01:42

なるほど。ちょっと理解できました。 まず、フォームから考えて返済期間1年と入力したとしたら、 数式の $return が 1 になるということなんですね。 数式の中に12が入っていますけど、年利なので、12で割る必要はないと思います。まずはここが大きく間違っているポイントかと。 ※ ただし、プルダウンでヶ月も選べるので、$returnをヶ月で扱うのか、年で扱うのかはちゃんと決めたほうがいいですね > 返ってきてほしい値は1.1(1(金額) * 0.1 (利息))となるとおもう こちらは 元本+利息金額 なので $money + ($money * ($interest_year/100)) → 11000 という意味かと思ったのですがあってますか?
m.ts10806

2020/01/08 01:44

基本四則演算の範囲におさまるのではないでしょうか。 ひとまず目の前の問題と関係ない情報と自覚あるようですし、編集して削除しておいてください。 それに現在の問題に直面しているのは高校時代のあなたではなくプログラミングをしているあなたなので。 確認すべきはあくまでプログラミングとアプリケーションの要求仕様であって数学の公式ではないと思います。
nana727

2020/01/08 01:50

https://teratail.com/users/tetsunosuke あっています。凄くわかりやすいです。 今はとりあえず、年利で計算してあとからif文でプルダウンメニューでわけるつもりです。 https://teratail.com/users/m.ts10806 了解しました。 削除しておきます。 ごもっともです。自己啓発書みたいで凄く心打たれました。きちんと見直します。
otn

2020/01/08 01:52

ちゃんと検証してはどうでしょう?
tetsunosuke

2020/01/08 02:04

すでに回答がついているようなので、一旦その方の内容を確認いただく、ということで大丈夫ですかね。 >高校は偏差値42の高校で数学I,Aしかやっていないのが現状です。 個人的には数学がよくわからない(=複利計算の公式が理解できない)ことが原因で問題がその公式の理解ができないことなのか、公式を利用するプログラミングが理解できないのかが区別がつけられない状態である、という意味合いでの記述と認識したので情報としてはあって悪くないものだとは思いましたけどね。 ついている回答はどちらかというと公式をプログラミングの観点から説明いただいていると思いますので、その観点で見てみてもらえればと思います。 数式がなぜそうなるのか?については、質問するサイトの趣旨としては違うと思うので、そのあたりについてはここまでにしますね。
m.ts10806

2020/01/08 02:06

「デバッグしろ」ということだと思います <検証
nana727

2020/01/08 02:12

https://teratail.com/users/tetsunosuke 僕的にはそういう観点で投稿しましたが、やはり人によって見え方が違うんですね。 でも、やはり少し甘えの部分も入っていたの思うのでそこは反省いたします。 ありがとうございます、凄くいい勉強になりました。 ご回答ありがとうございます。 https://teratail.com/users/m.ts10806 ご回答ありがとうございます。
otn

2020/01/08 02:26 編集

検証とは、 > 間違っているような気がします。 & 数学スキルが無い ということだったので、「元利均等返済 シミュレーション」でググって見つかるサイト、ないし、返済シミュレーション機能付き電卓で、答え合わせすれば?と言うことでした。 自信の無い計算は答え合わせをするのが普通でしょう。
nana727

2020/01/08 02:26

了解しました。 ありがとうございます。
guest

回答1

0

ベストアンサー

間違ってますよ。

引用されている数式は

#分子 Ar( 1 + r )**n
#分母 ( 1 + r )**n - 1

となっています。(TeXが欲しい)
A は $money、r は $interest_year / 100 / 12、n は $return * 12 ですから、変数を用意して代入すればいいかと思います。

PHP

1$_a = $money; 2$_r = $interest_year / 100 / 12; 3$_n = $return * 12; 4 5$numerator = $_a * $_r * ( 1 + $_r ) ** $_n; 6$denominator = ( 1 + $_r ) ** $_n - 1; 7 8$a = $numerator / $denominator;

(動作確認してません)

長いコードは可読性が悪くなります。他人が読みにくいだけではなくて、書いている本人が混乱することもあります。
かっこ悪いと思うかもしれませんが、無理せずに短いコードで書いた方がいいかと思いますよ。

投稿2020/01/08 01:37

Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/01/08 01:50

すみません表現で気になった点が。 >かっこ悪いと思うかもしれませんが、無理せずに短いコードで書いた方が 長いコードと同じ効果を出す 短いコードを「かっこいい」とするのが通常ではないでしょうか? となると「多少不細工でも長くても自分が理解できて書けるコードで書きましょう」となるのでは…?
Lhankor_Mhy

2020/01/08 01:53

私、ワンライナーをかっこいいと感じてしまうタイプなので、「一行が長いコード」という意味で書きました。 わかりにくいですね、すみません。
m.ts10806

2020/01/08 01:55

ああ、そういうことですね。 どのあたりに配慮したのか分からないアドバイスだったためのコメントでした。失礼しました。 あくまで私自身が「まずは自分が書けるやり方で書きましょう」というスタンスから詰めていくタイプでしたので。 もちろん最終的にワンライナーできればかっこいいと思うのは同じです。
nana727

2020/01/08 01:59

動作確認してみました。 凄く金額は近かったです。 借入金額10000 利息 1% 返却 1% var_dumpで帰ってきた値、float(837.85411555805)  それを*12でかける 10,044 838 * 12 = 10056 10000の1%を一年で返すなら、合計値は10100円前後で返ってくるを思うのですが、おかしいでしょうか?
Lhankor_Mhy

2020/01/08 02:06

月々の支払いごとに元本が減っているので、元本が減らない想定の金利(いわゆるアドオン金利)の半分ぐらいになるはずです。 ちなみに、通常、月賦の場合は、金利は日割精算されることが多いです。 この計算式は、月割りをしているので、現実には誤差が出ると思います。
nana727

2020/01/08 02:12

そういうことですね。 理解できました。ありがとうございます。 ご回答ありがとうございました。
nana727

2020/01/08 02:15

ありがとうございます。 ブックマークしておきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問