在以下代碼中,i
將始終爲偶數,因此商i/2
應始終爲整數。我是否還應該使用Math.floor(i/2)
來保證安全?我在問,因爲JavaScript不會將所有數字視爲浮點數,所以我擔心舍入誤差。通過商標對數組索引
for (var i = 0; i < data.length; i = i + 2) {
var name = names[i/2];
...
}
在以下代碼中,i
將始終爲偶數,因此商i/2
應始終爲整數。我是否還應該使用Math.floor(i/2)
來保證安全?我在問,因爲JavaScript不會將所有數字視爲浮點數,所以我擔心舍入誤差。通過商標對數組索引
for (var i = 0; i < data.length; i = i + 2) {
var name = names[i/2];
...
}
按照JavaScript(ECMAScript®) Language Specification如果
i <= Number.MAX_SAFE_INTEGER + 1
然後i
可以確切地表示,分工應該很好。
Number.MAX_SAFE_INTEGER
的值是最大的整數n,使得n和n + 1都可以精確地表示爲數值。
Number.MAX_SAFE_INTEGER
的值是9007199254740991(2 -1)。
Section 12.7.3.2 Applying the/Operator
在其餘的情況下,如果既沒有無窮大,也不是零,也不NaN被涉及,則商被計算並舍入到使用IEEE 754-2008最接近的可表示值圓到最近,與均勻模式相關。如果幅度太大而無法表示,則操作溢出;那麼結果就是無限的適當符號。如果幅度太小而無法表示,則操作下溢,結果爲適當符號的零。ECMAScript語言要求支持IEEE 754-2008定義的逐漸下溢。
不,您不必在這種情況下使用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]);
}
除以甚至由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]);
}
因爲它節省了這些不必要的數學運算......
@anvita感謝您添加一個片段;) –
您能否提供一個鏈接到證明您的聲明的文檔?謝謝 – Roland
@roland *在餘下的情況下,無論是無窮大,也不是零,也不涉及NaN,使用IEEE 754-2008圓到最近模式計算商並四捨五入到最接近的可表示值。如果幅度太大而無法表示,則操作溢出;那麼結果就是無限的適當符號。如果幅度太小而無法表示,則操作下溢,結果爲適當符號的零。 ECMAScript語言要求支持IEEE 754-2008定義的逐漸下溢* –
據我所知,它工作在這個特殊的例子,但你怎麼知道有沒有一些平臺,讓'我/ 2'將返回'1.00000002'並給出一個錯誤,如果我試圖通過索引呢? – Roland
如果我從零開始,每次迭代增加2,我不明白爲什麼i/2會返回除了整數之外的任何值。你能說出任何你知道的平臺的例子嗎? –