masa_beginner
@masa_beginner

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

変数同士の掛け算の答えがNaNになってしまい計算できない理由が分かりません。

解決したいこと

変数同士の掛け算の答えがNaNになってしまい計算できないが理由を解明したい。

例)

発生している問題・エラー

変数同士の掛け算の答えがNaNになってしまい計算できない
なぜlength関数の戻り値にisNaNを使うとfalseになるのでしょうか?
なぜslide_widthとslide_counterの掛け算の答えがNaNになってしまうのでしょうか?
parseIntを両方に適応してあげると、一応期待していた答えが出ましたが、そもそも数値同士の掛け算なので特別な処理をしなくても、合計値が出てくるはずなので混乱しています。

該当するソースコード

    let slide_width = $('.slide-card').css('width'); //slide1枚の幅
    console.log(slide_width); //出力結果 > 500 
    cnsole.log(isNaN(slide_width)); //出力結果 > true //数値として扱われている

	let slide_counter = $('.slide-card').length; //slideが何枚存在するか
    console.log(slide_counter); //出力結果 > 5 //slideの枚数5枚
    console.log(isNaN(slide_counter)); //false //数値として扱われていない、本来であればtrueであって欲しい

    let total_width = slide_width*slide_counter;
    console.log(total_width); //出力結果 > NaN //2500と出力されてほしい

    console_log(slide_width*slide_counter); //出力結果 > NaN //2500と出力されてほしい
    console.log(parseInt(slide_counter)*parseInt(slide_width)); //出力結果 > 2500

    //しかしslide_counter単体にparseIntをかけてisNaNすると数値として認識されない。もう意味がわかりません泣
    console.log(isNaN(parseInt(slide_counter))); //出力結果 > false
    

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。
isNaNでの数値かどうかの検証、parseIntにての整数変換を試みる

0

4Answer

isNaNis Not a Numberであり、trueであれば数値ではないことを表します。
逆に考えていませんか?

1Like

ソースコード3行目のisNaNがtrueになってるので、slide_widthは数値型になっていないのではないですか?コメントを見るにisNaNの認識が逆になってるように思えます。
jqueryのcssメソッドのリファレンスを読んでみてください。

1Like

まず、 isNaN は数値かどうかを判定する関数ではありません。数値、または数値として解釈できる文字列でれば false、それ以外の型または解釈できない文字列または NaN なら true、です。

    let slide_width = $('.slide-card').css('width'); //slide1枚の幅
    console.log(slide_width); //出力結果 > 500 
    cnsole.log(isNaN(slide_width)); //出力結果 > true //数値として扱われている

ここで出力結果が 500 となっていますが、実際は 500px のような単位がついた文字列では?これは数値として解釈できない文字列なので、 isNaN(slide_width) が true を返すのは正しいです。「数値として扱われている」は間違いです。

次に、

    let slide_counter = $('.slide-card').length; //slideが何枚存在するか
    console.log(slide_counter); //出力結果 > 5 //slideの枚数5枚
    console.log(isNaN(slide_counter)); //false //数値として扱われていない、本来であればtrueであって欲しい

slide_counter は数値ですから isNaN(slide_counter) は false を返します。「数値として扱われていない」は間違いです。

そして、


    console_log(slide_width*slide_counter); //出力結果 > NaN //2500と出力されてほしい
    console.log(parseInt(slide_counter)*parseInt(slide_width)); //出力結果 > 2500

slide_width*slide_counter は数値として解釈できない文字列と数値のかけ算ですから、その結果は NaN になります。

parseInt(slide_width) は数値を与えていますからそのまま数値を返します。 parseInt に文字列を与えると、先頭に数字の並びがあれば数値として返します。よって parseInt(slide_width) は文字列 500px の先頭を読み取って数値500を返します。

結果、 parseInt(slide_counter)*parseInt(slide_width)5*500 のかけ算になり、2500を返します。

最後に、

console.log(isNaN(parseInt(slide_counter))); //出力結果 > false

上述の通り parseInt(slide_counter) は数値5を返しますから isNaN の結果は false で正しいです。


幅と枚数をかけ算したいなら parseInt(slide_width) * slide_counter してください。

1Like

皆さんのご指摘の通り、isNaNのtrueとfalseを逆に考えていたのが原因のようです。
しかも、console.log(slide_width);の出力結果を確認したところ500ではなく500pxと出力されていて、slide_widthが数値ではなく数字として扱われているのが明らかでした。泣
解決方法としては、
parseInt(slide_width)とするか.css('width')で500pxを取得するのではなく、width()を用いてそもそもpxを含まない数値の取得を試してみようと思います。
とてつもなく混乱していたのですが、本当にスッキリしました。本当に皆様ありがとうございます!m(__)m

0Like

Your answer might help someone💌