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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

4回答

1737閲覧

javascriptでエクセルの関数を書いたらNaNが返ってきてしまう

flower_tako

総合スコア20

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2019/09/20 02:40

javascriptでPMT関数を書いていますがNaNが返ってきてしまいます。
入力フォーム(input type="number")の数値を使って計算結果を表示したいと思います。

//各変数を定義    var ir = $('#interest_rate').val() / 12; var np = $('#periods_number').val() * 12; var pv = $('#present_value').val(); var fv = 20000000; function PMT(ir, np, pv, fv) {          var pmt = ( ir * ( pv * Math.pow ( (ir+1), np ) + fv ) ) / ( ( ir + 1 ) * ( Math.pow ( (ir+1), np) -1 ) ); console.log(pmt); return pmt; }

文字が混ざっているのかと思い変数を isNaNで判定しました。

    console.log('isNaN("ir") = ' + Number.isNaN(ir)); console.log('isNaN("np") = ' + Number.isNaN(np)); console.log('isNaN("pv") = ' + Number.isNaN(pv)); console.log('isNaN("fv") = ' + Number.isNaN(fv));

結果はfalseで返ってきておりますので数値であることは確認しております。
ですが PMT関数を実行するとNaNが返ってきてしまいます。
考えられる原因はどういったことがありますでしょうか?

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

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

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

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

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

flower_tako

2019/09/20 03:12

string を発見しました!こちら修正してもう一度試してみます!
guest

回答4

0

ベストアンサー

おそらく、なんらかのイベントを受けてPMT関数を呼び出すようなコードになっていると思うのですが。

↓この部分は、どこに書いていますか?

js

1    var ir = $('#interest_rate').val() / 12; 2 var np = $('#periods_number').val() * 12; 3 var pv = $('#present_value').val(); 4 var fv = 20000000;

↓このように書いてあればいいのですが、

js

1$('#calc').on('click',()=>{ 2 var ir = $('#interest_rate').val() / 12; 3 var np = $('#periods_number').val() * 12; 4 var pv = $('#present_value').val(); 5 var fv = 20000000; 6 PMT(ir, np, pv, fv); 7});

↓こう書いてあるなら、NaNになると思います。

js

1var ir = $('#interest_rate').val() / 12; 2var np = $('#periods_number').val() * 12; 3var pv = $('#present_value').val(); 4var fv = 20000000; 5$('#calc').on('click',()=>{ 6 PMT(ir, np, pv, fv); 7});

投稿2019/09/20 05:49

Lhankor_Mhy

総合スコア36115

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

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

flower_tako

2019/09/20 07:07

ご返答ありがとうございます。 確認したところコールする場所と引数が渡っていないことが原因でした。 皆様にいただいた情報を元に数値が返ってくるコードになりました。
guest

0

Number.isNaNは、NaNという値のときしかtrueになりません。たとえばNumber.isNaN('teratail')でもfalseです。

いったんNumber(値)あるいは値 - 0のような方法で数値に変換した上で、Number.isNaNで評価する必要があります。

投稿2019/09/20 02:46

maisumakun

総合スコア145184

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

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

maisumakun

2019/09/20 02:49

NumberなしのisNaNを使う、というのもありかも。
flower_tako

2019/09/20 02:53

ご返答ありがとうございます。 isNaNで変数を判定してみました。falseが返ってきましたので数値ということは確認いたしました。
maisumakun

2019/09/20 02:56

値によっては計算不能となることが考えられますが、「どんな値を入れても」NaNが返ってくる状況でしょうか、それとも値によっては正常に計算されますでしょうか。
flower_tako

2019/09/20 02:59

inputに任意の数字を入れてコンソール出力してみたのですが数値にはなっているようでした。 ・ir 0.3333333333333333 ・np 120 ・pv 300000 ・fv 20000000
flower_tako

2019/09/20 03:00

NaNしか返ってきません....
x_x

2019/09/20 05:19

本題ではないですが、ir が 0.33……ということは年利400%なので、入力値を見直してみてはどうでしょうか?
flower_tako

2019/09/20 07:15

%で混同してます。確認します! ご指摘ありがとうございます!
guest

0

皆様、ご回答いただきましてありがとうございます。いただいた返答を元に再度修正いたしました。
コールに引数が渡っていないことが原因でした(初歩的なことでお騒がせいたしました)。

// PMT関数を定義する function PMT(ir, np, pv, fv) { var pmt = ( ir * ( pv * Math.pow((ir + 1), np) + fv ) ) / ( ( ir + 1 ) * ( Math.pow((ir + 1), np) - 1 ) ); return pmt; } $('btn').on('click', function () { var ir = $('#interest_rate').val() / 12; var np = $('#periods_number').val() * 12; var num = $('#present_value').val(); var pv = Number(num); //stringを数値にする var fv = 20000000; var result=PMT(ir, np, pv, fv);//コールして数値を取得する alert(result); }

エラーが出た時どこから手をつけていいのか検討がつきませんでしたがみなさんに意見をいただくことで少しずつか解決できました。ありがとうございます。

投稿2019/09/20 08:15

flower_tako

総合スコア20

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

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

0

JavaScript

1var pmt = ( ir * ( pv * Math.pow ( (ir+1), np ) + fv ) ) / ( ( ir + 1 ) * ( Math.pow ( (ir+1), np) -1 ) );

除算があるので、

JavaScript

1( ( ir + 1 ) * ( Math.pow ( (ir+1), np) -1 ) )

この結果が 0 になってるとか?

投稿2019/09/20 03:08

tacsheaven

総合スコア13703

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

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

flower_tako

2019/09/20 03:31

レスポンスありがとうございます。 Math.pow ( (ir+1), np) -1 )を実行してもNaNが表示されてしまいました。 小数点以下が多すぎる等でもしかしたら計算できないことあるのでしょうか?ここらへんを調査してみます!
tacsheaven

2019/09/20 04:03

np が 120 ですよね? つまり120乗するので、そこで計算できなくなってたりするのかも知れません。
flower_tako

2019/09/20 04:17

12ケ月を10年間という内容で120乗なのですが今一度式の内容を確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問