在以下代码中,i
将始终为偶数,因此商i / 2
应始终为整数。我还应该使用Math.floor(i / 2)
安全吗?我问,因为JavaScript确实将所有数字视为浮点数,所以我担心舍入错误。
for (var i = 0; i < data.length; i = i + 2) {
var name = names[i / 2];
...
}
答案 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定义的逐渐下溢。