我正在使用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)。我究竟做错了什么?
答案 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
无论如何,您应该对代码进行一些更改:
不要使用for ( x in a )
迭代数组;使用数字for循环:for (var i=0,len=a.length;i<len;++i)
始终var
您的变量。您正在使用和覆盖全局thisrow
变量。即使你使用for ... in
,也要这样做for (var x in o)
(除非你在函数的前面声明了你的变量)。
您应该使用th += ...
代替th = th + ...
,因为它更短且干燥。
你应该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识别第一个整数,并尝试将第二个操作符转换为整数。顺便问一下,你使用什么浏览器?