2016-08-10 6 views
-2

私は渡された変数に基づいて結果を返すJavascript関数を持っています。しかし、計算中に間違った値を与えています。JavaScriptの方程式が不正確な値を生成する

私はここに犯人を狭めてきました:

その数値でコードから変数を交換するときに(はい、私は彼らがに渡される正しい値であることを確認するためにチェックしました
Math.floor((obj.mem1.val1 + i) * (obj.mem2[param][j].val2)) 

式)、それは次のとおりです。

Math.floor((90 + 15) * (0.5343543)) 

代わりに等しい56に出てくるはずですが4817を与えています。ブラウザを手動で正確な計算を実行することが右の数を出しますが、それはまだ4817を言って警告ボックスを与えた場合にだけ見ることが

alert(Math.floor((90 + 15) * (0.5343543))) 

:私もに追加しました。

これを行う可能性はありますか?それは基本的な数学を間違っている。何か私はいつもコンピュータが正しく動作するように信頼してきました。コメント欄で述べたように

var obj = { 
    "mem1": { 
    "val1": "90" // <-- issue was ultimately here this value was being 
       //  populated from 
       //  document.getElementById().innerHTML 
       //  elsewhere in the code, so it was saving a string 
    }, 
    "mem2": { 
    "something-passed-through-param": [ 
     { "val2": 0.5343543 } 
     ] 
    } 
    }; 

function func(param, i, j) { 
    var ret = Math.floor((obj.mem1.val1 + i) * (obj.mem2[param][j].val2)); 
    return ret; 
    } 

// Correct code would have been: 
var ret = Math.floor((Number(obj.mem1.val1) + i) * (obj.mem2[param][j].val2)); 
+0

明らかに、何かはあなたが信じているものではありません。 [最小限のテストケース](http://stackoverflow.com/help/mcve)を構築してください。さもなければ、基本的に推測ゲームをしています。 –

+0

私はコンソールで同じコードを実行し、56を取得しました。何かがあなたの値を乱している必要があります。 –

+5

'obj.mem1.val1'は' i'に追加される前に数値に変換されていますか?あなたの '('90 '+ 15)*(0.5343543)'のように見えますが、それは '4817'またはその周辺に現れます。基本的には、あなたが本当に得ているのは連結ですと思います。 ' + 'は '+ 'が加算ではなく連結演算子として扱われます。あなたはおそらくそれを何とか左から3文字にトリミングしています。 –

答えて

1

コメントによれば、問題はt帽子obj.mem1.val1が文字列として計算に渡され、('90' + 15) * (0.5343543)以上の可能性があります。('90' + 1) * (0.5343543)番号にキャストすると問題が解決されます。これには、同様に行うことができる。

Math.floor((+obj.mem1.val1 + i) * (obj.mem2[param][j].val2)) 

または

Math.floor((Number(obj.mem1.val1) + i) * (obj.mem2[param][j].val2)) 

およびその他のいくつかの方法。

2

は、式Math.floor(("90"+"15") * (0.5343543));4817

0

使用を与える:Math.floor((obj.mem1

EDIT

サンプルコードは、エラーを表示します。 val1 * 1 + i)*(obj.mem2 [param] [j] .val2))

+1

個人的に私は 'Math.floor((+ obj.mem1.val1 + i)*(obj.mem2 [param] [j] .val2))' –

0

Math.floor(('90' + '15') * (0.5343543))は、4817を返します。つまり、obj.mem1.val1iを整数に変換する必要があります。

がエラーであった場合は正常に動作するはずです。

関連する問題