通过商对数组建立索引

时间:2017-07-28 15:10:30

标签: javascript rounding-error rounding

在以下代码中,i将始终为偶数,因此商i / 2应始终为整数。我还应该使用Math.floor(i / 2)安全吗?我问,因为JavaScript确实将所有数字视为浮点数,所以我担心舍入错误。

for (var i = 0; i < data.length; i = i + 2) {
    var name = names[i / 2];
    ...
}

3 个答案:

答案 0 :(得分:3)

没有。在这种情况下,您不必使用Math.floor()

因为i始终是偶数,names[1.00]也相当于names[1]

要检查,请在javascript控制台中尝试以下操作。

数组的长度为20,前10个数组项将被打印

var names = ["nums1", "nums2", "nums3","nums4", "nums5", "nums6","nums7", 
    "nums8", "nums9","nums10", "nums11","nums12", "nums13","nums14", "nums15", 
    "nums16","nums17", "nums18", "nums19","nums20"];

for (var i = 0; i < names.length; i = i + 2) {
    console.log(names[i/2]);
}

答案 1 :(得分:2)

将偶数除以2总是返回一个整数,只要它不溢出

Number.MAX_SAFE_INTEGER

之后,整数以2的幂存储,因此它们会失去精度 但是,大于此大小的数组在访问其元素时会遇到问题(因为索引变得不精确),可以推入数组的最大元素数量仅限于此最大安全整数。所以基本上你的代码总是会工作,如果没有,那是因为数组溢出而不是因为索引是错误的。但是,我建议你这样做:

  var array = ["one", "two", "three","four", "five", "six","seven", 
    "eight", "nine","ten", "eleven","twelve", "thirteen","fourteen", "fifteen", 
    "sixteen","seventeen", "eighteen", "nineteen","twenty"];
    
  for(var i=0,l=array.length/2;i<l;i++){
      console.log(array[i]);
    }

因为它节省了这些不必要的数学运算......

答案 2 :(得分:0)

根据JavaScript(ECMAScript®) Language Specification if

i <= Number.MAX_SAFE_INTEGER + 1

然后可以准确地表示i,并且除法应该很好。

  

Number.MAX_SAFE_INTEGER的值是最大的整数n,使得n和n + 1都可以精确地表示为Number值。

     

Number.MAX_SAFE_INTEGER的值是9007199254740991(2 53 -1)。

<强> Section 12.7.3.2 Applying the / Operator

  

在剩余的情况下,既不涉及无穷大,也不涉及零,也不涉及NaN,计算商并使用IEEE 754-2008舍入到最接近的可表示值舍入到最接近,与偶数模式相关联。如果幅度太大而无法表示,则操作溢出;结果是无穷无尽的适当标志。如果幅度太小而无法表示,则操作下溢,结果为适当符号的零。 ECMAScript语言需要支持IEEE 754-2008定义的逐渐下溢。