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

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

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

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

Q&A

解決済

2回答

2547閲覧

toFixedメソッドが適用されない

aae_11

総合スコア178

JavaScript

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

0グッド

0クリップ

投稿2019/08/18 11:31

下記コードのupdateTime関数内の変数「accuration」において、toFixedメソッドを通しているのですが、適用されなかった為、原因が分からずご質問させて頂きました。

'use strict'; { let words = ['blue','apple','sky','middle','set']; let word; let isPlaying = false; let loc = 0; let target; let letter_count = 0; let miss_count = 0; let miss_label; let letter_label; let timeLimit; timeLimit = 3 * 1000; let start_time; let time_label = document.getElementById('time_left'); let accuracy window.addEventListener('click',() => { if(isPlaying == true){ return; } function updateTime(){ let time_left = start_time + timeLimit - Date.now(); time_label.textContent = (time_left / 1000) .toFixed(2); const time_out_id = setTimeout(() => { updateTime(); },10); if(time_left < 0){ isPlaying = false; clearTimeout(time_out_id); if(letter_count == 0 && miss_count == 0){ accuracy = 0; }else if(miss_count == 0){ accuracy = 100 }else if(letter_count == 0){ accuracy = 0; }else{ accuracy = (miss_count / letter_count) * 100; accuracy.toFixed(2); console.log(accuracy); } console.log(miss_count); console.log(letter_count); window.alert(letter_count + 'letters,' + miss_count + 'misses, ' + accuracy + '%accuracy!'); } } isPlaying = true; letter_label = document.getElementById('Letter_label'); miss_label = document.getElementById('Letter_miss_label'); target = document.getElementById('top_word'); word = words[Math.floor(Math.random() * words.length)]; target.textContent = word; start_time = Date.now(); updateTime(); }); window.addEventListener('keyup', e => { if(isPlaying === true){ let placeholder = ''; if(e.key == word[loc]){ loc++; letter_count += 1; console.log(letter_count); letter_label.textContent = letter_count; for(let i = 0; i < loc; i++){ placeholder += '_'; } console.log(word.substring(loc)); console.log(placeholder); target.textContent = placeholder + word.substring(loc); }else{ miss_count++; miss_label.textContent = miss_count; } if(loc == word.length){ word = words[Math.floor(Math.random() * words.length)]; target.textContent = word; loc = 0; } } }); }

updateTimeメソッド内のaccurationが「33.33333」であったとしても、toFixedメソッドを通した場合でも、変わらず、console.log(accuracy);の出力結果は変わらず、「33.33333」になってしまいます。
原因究明の為、ご助言頂けましたら幸いです。

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

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

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

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

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

m.ts10806

2019/08/19 03:27

そもそもご自身は原因究明のため何をされたのでしょうか。 コメントから、あまり自身が提示されたコードをちゃんと理解して書いているように思えません。
guest

回答2

0

ベストアンサー

変換した値を代入していないのが問題です。

javascript

1accuracy = accuracy.toFixed(2);

toFixedは文字列で返すのでaccuacyを常に数値にしたければ、数値に直す必要があります。
以下の好きな方法で数値に変換すれば良いと思います。

javascript

1// Numberでキャストして数値にする 2accuracy = Number(accuracy.toFixed(2));

javascript

1// +演算子で数値にする 2accuracy = +accuracy.toFixed(2);

javascript

1// parseFloatで数値にする 2accuracy = parseFloat(accuracy.toFixed(2));

投稿2019/08/18 12:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

aae_11

2019/08/19 11:08

ご回答ありがとうございます。 提示頂いたコードから、数値が入った変数には文字列を代入できない為キャストしている、との理解を致したのですが、そのような解釈で合っていますでしょうか?
退会済みユーザー

退会済みユーザー

2019/08/19 12:59

> 数値が入った変数には文字列を代入できない為キャストしている、との理解を致したのですが 違います. toFixedは文字列を返すのでそのまま代入するとaccuracy は文字列になります。 別にそれで問題ないのであれば文字列のままで構いません。 ただ、accuracy が数字だと思って足し算すると問題が発生するため、 数字に直しておいたら後のバグを減らせるので数値に変換しておいた方が無難というぐらいで、別に必須ではありません。 足し算すると問題が発生するという意味が分からなければ、以下の結果が何になるか考えてください。 var x = '1234.12' + 5 // 文字 + 数値
aae_11

2019/08/20 00:10

ご返信ありがとうございます。 そういうことだったのですね...ご親切にご説明くださりありがとうございました。 Number()とし、キャストする方法が簡単に思えましたので、そちらの方法を使用できればと思います。
guest

0

toFixedは引数に与えられた変数そのものは変更しませんよ。
あと、数値型(Number)は不変なので変更もできないと思います。
なので、次のようにする必要があると思います。

formattedAccuracy = accuracy.toFixed(2); console.log(formattedAccuracy);

投稿2019/08/18 11:54

編集2019/08/18 11:55
wintermaples

総合スコア116

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

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

aae_11

2019/08/19 10:57

ご回答ありがとうございます。 >数値型(Number)は不変なので変更もできない こちらの部分なのですが、数値型の変数には文字列型を代入することができない、ということでしょうか...?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問