2

我正在使用 jQuery 从网页中提取一些数据,它以数组的形式返回,其中包含我正在尝试添加的以下值(.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. 您应该使用*1而不是parseFloat. 它更快,更少打字,并且当你有一个 janky 字符串时不会对你撒谎。

于 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],则浮点数将保留其原始值,而不是四舍五入。因此,我的建议是使用标准的 for() 循环而不是 for(in)。

编辑:

对于那些不相信我的结果的人,请查看以下代码片段:

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

alert(arr[0]);

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

这是OP问题的简化版本,但原理相同。查看警报语句的结果。它将是 0.5、0.5,然后是 0 ...全部来自我引用变量的方式,该变量可能指向内存中的同一位置,但在后一种情况下,将值四舍五入(显然)。

我自己在最新版本的 Firefox 上对此进行了测试。

于 2011-02-09T18:41:37.860 回答
-1

对此不确定,但尝试编写 var th = 0.0; - 也许,javascript 识别第一个整数并尝试将第二个操作数转换为整数。顺便问一下,你用什么浏览器?

于 2011-02-09T18:23:22.647 回答