Javascript:parseFloat不能正常工作

时间:2011-02-09 18:15:40

标签: javascript parsefloat

我正在使用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 个答案:

答案 0 :(得分: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. 你应该use *1 instead of parseFloat。它更快,更少打字,并且当你有一个笨拙的字符串时不会骗你。

答案 1 :(得分:2)

var hours = objGrid[thisrow]['hours']+"";

应该做的伎俩。 ParseFloat()接受charaster number的值。

答案 2 :(得分:0)

问题是:为什么你的小数值被四舍五入。在我自己四处寻找之后,我发现for(... in ...)构造本身正在将值向下舍入。如果直接访问数组元素,即objGrid [0] [i],则浮点数将保留其原始值,而不是舍入。因此,我的建议是使用标准for()循环而不是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上测试过。

答案 3 :(得分:-1)

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