2

jQueryを使用してWebページからデータを取得していますが、追加しようとしている次の値(.5、.25、1.25、3.75)の配列として返されます。これが私のコードスニペットです:

var th = 0;
    for (thisrow in objGrid) {
        var hours = objGrid[thisrow]['hours'];
        th = th+parseFloat(hours);
        console.log(hours);

        $("#msgbox").html("Showing records for week: " + thisDate + ". Total Hours for the week : " + th);
   }

console.logで、これを何時間も取得しています-0、0、1、3、合計4です。parseFloatを使用しなくても同じ結果が得られます(NaNが得られると思います)。私は何が間違っているのですか?

4

4 に答える 4

3

あなたが説明していることはうまくいくはずなので、あなたは他の問題を抱えているに違いないと思います。例(これはあなたのコードの悪いが直接の翻訳です):

var grid = [ ".5", ".25", "1.25", "3.75" ];
var th = 0;
for (x in grid){
  var h = grid[x];
  var hrs = parseFloat(h);
  th = th + hrs;
  console.log( h, hrs );
}
//   .5 0.5
//  .25 0.25
// 1.25 1.25
// 3.75 3.75

console.log( th );
// 5.75

とにかくコードについて変更する必要があるいくつかのこと:

  1. for ( x in a )配列を反復処理するために使用しないでください。数値のforループを使用します。for (var i=0,len=a.length;i<len;++i)

  2. 常にvarあなたの変数。thisrowグローバル変数を使用して上書きしています。を使用する場合でも、for ... inそのようにfor (var x in o)します(関数の前半で変数を宣言していない場合)。

  3. 短くて乾燥しているという理由だけで、のth += ...代わりに使用する必要があります。th = th + ...

  4. の代わりに使用*1parseFloatする必要があります。それはより速く、タイピングが少なく、そしてあなたがぎくしゃくした文字列を持っているときあなたに嘘をつきません。

于 2011-02-09T18:35:36.050 に答える
2
var hours = objGrid[thisrow]['hours']+"";

トリックを行う必要があります。ParseFloat()は、文字番号の値を取ります。

于 2011-02-09T18:56:42.203 に答える
0

問題は、なぜ小数値が丸められるのかということです。自分の周りを突っついた後、for(... in ...)構文自体が値を切り捨てていることに気付きました。配列要素に直接アクセスする場合、つまりobjGrid [0] [i]の場合、floatは元の値を保持し、丸められません。したがって、私の提案は、for(in)の代わりに標準のfor()ループを使用することです。

編集:

私の結果を信じない人は、次のコードスニペットをチェックしてください。

var arr = [.5,.25,1.25, 3.75];

alert(arr[0]);

for(v in arr){
    alert(arr[0]);
    alert(v);
}

これはOPの質問の単純化されたバージョンですが、同じ原則です。アラートステートメントの結果を見てください。それは.5、.5、そして0 ...になります。これは、おそらくメモリ内の同じ場所を指していると思われる変数を参照している方法からですが、後者の場合、値を丸めます(明らかに)。

Firefoxの最新バージョンでこれを自分でテストしました。

于 2011-02-09T18:41:37.860 に答える
-1

これについてはわかりませんが、var th=0.0と書いてみてください。-おそらく、javascriptは最初の整数を認識し、2番目のオペラントを整数に変換しようとします。ちなみに、どのブラウザを使っていますか?

于 2011-02-09T18:23:22.647 に答える